it-swarm-ru.tech

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

Я могу получить все изображения jpg, используя:

find . -name "*.jpg"  

Но как я могу добавить png файлы к результатам?

143
wong2

Используйте флаг -o Между различными параметрами.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) работает как шарм.

NOTE Там должен быть пробел между скобкой и ее содержимым, иначе он выиграл не работает.

Объяснение:

  • -type f - только поиск файлов (не каталогов)
  • \( & \) - необходимы для применения -type f Ко всем аргументам
  • -o - логический оператор OR)
  • -iname - как -name, Но совпадение не чувствительно к регистру
176
Shadur

Вы можете комбинировать критерии с -o as предложено Шадуром . Обратите внимание, что -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, чтобы объединить расширения более кратким способом. Синтаксис регулярного выражения по умолчанию - Emacs ( базовые регулярные выражения плюс несколько расширений, таких как \| для чередования); есть возможность переключиться на расширенное регулярное выражение .

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

В FreeBSD, NetBSD и OSX вы можете использовать -regex в сочетании с -E для расширенных регулярных выражений.

find -E . -regex '.*\.(jpg|png)'
91
Gilles 'SO- stop being evil'

Это более правильно:

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

Чтобы было понятно, единственный вариант, который работает в Linux, Unix и MacOS, это:

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

Это потому, что версия OS X немного отличается, но важно писать вещи, которые хорошо работают на большинстве платформ.

9
sorin