Як використовувати команду find для пошуку кількох розширень


Відповіді:


152

Використовуйте -oпрапор між різними параметрами.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) працює як шарм.

Примітка Там повинно бути простір між кронштейном і його зміст або він не буде працювати.

Пояснення:

  • type -f - лише пошук файлів (не каталогів)
  • \(- необхідний для type -fзастосування для всіх аргументів
  • -o - логічний оператор АБО
  • -iname- як -name, але відповідність нечутлива до регістру

Чи потрібні дужки. Команда працює для мене без них. Чи потрібні вони для деяких снарядів?
MikeD

2
@miked Команда буде "працювати" без них, так, але ви закінчите отримувати звернення до каталогів, які закінчуються .png, а також файлів, які закінчуються .jpg, що не зовсім те, що було призначено.
Шадур

1
Дякуємо за уточнення! type -fЧи не поширюється і поширюється на обох виразів без дужок, так, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngтеж працює ... хоча це два символи більше :-)
MikeD

2
Це питання переваги оператора. Так само, як a * b + cі відрізняється відa * (b + c)
Шадур

2
@jdhao Хороший улов, поправки.
Шадур

86

Ви можете комбінувати критерії з , -oяк було запропоновано Shadur . Зауважте, що -oвона має нижчий пріоритет, ніж порівняння, тому вам можуть знадобитися круглі дужки.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

У Linux ви можете використовувати -regexдля комбінування розширень більш стислим способом. За замовчуванням синтаксис regexp - Emacs ( базові регулярні вирази плюс кілька розширень, наприклад, \|для чергування); є можливість переключитися на розширені регулярні вирази .

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

На FreeBSD, NetBSD та OSX можна використовувати -regexкомбіновані з -Eдля розширених регулярних виразів.

find -E . -regex '.*\.(jpg|png)'

Завжди краще використовувати -inameзамість -name- тоді ви також захопите image.JPGіimage.PnG
ccpizza

40

Це правильніше:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
Чому ти кажеш, що це "більш" правильно?
Кевін

2
@Kevin я здогадуюсь тому, що -iregexсірники jpgтак само JPG Jpg jpGі такі. Я думаю, що $це не потрібно.
ott--

Це добре працює на MinGW .
Пітер Мортенсен

2
Спочатку ви пропустили папку пошуку як перший аргумент, який призведе до помилки. По-друге, на OSX уникнути дужок не вийде, і це слід використовувати замість цього: find -E . -iregex '.*\.(jpg|png|gif)'як показано у відповіді @ sorin.
ccpizza

8

Щоб зрозуміти, єдиний варіант, який працює на Linux, Unix та macOS, є:

find -E . -regex '.*\.(jpg|png)'

Це тому, що версія OS X трохи інша, але це важливо, щоб написати речі, які добре підходять на більшості платформ.


2
-Е прапор не дійсний для пошуку на Ubuntu 14.04
gogaman

Прапор -E недійсний і на MinGW (принаймні версія / конфігурація, на яку я його приміряв (конфігурація за замовчуванням для певної версії)).
Пітер Мортенсен

Яка частина -type f \( -iname \*.png -o -iname \*.jpg\)не працює на OSX?
Шадур

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.