Как использовать команду find, чтобы найти все файлы с расширениями из списка?


179

Мне нужно найти все файлы изображений из каталога (GIF, PNG, JPG, JPEG).

find /path/to/ -name "*.jpg" > log

Как изменить эту строку, чтобы найти не только файлы .jpg?

Ответы:



138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

буду работать. Там может быть более элегантный способ.


16
- имя будет нечувствительным к регистру
Крис Костон

1
@Gerald: Скорее всего, вам нужно сгруппировать выражение OR в экранированных скобках: в find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;противном случае exec применяется только к последней части ( -iname '*.jpg' в данном случае).
Приостановлено до дальнейшего уведомления.

Это важное замечание. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0будет печатать только файлы JPG! Здесь вам нужны скобки:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Анна Ван Россум

28

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

-EСпасает вас от того , чтобы избежать скобок и трубы в своем регулярном выражении.


2
моя находка не имеет этого -E
wieczorek1990

1
Хммм, -Eопция говорит findиспользовать «расширенные регулярные выражения». Некоторые другие инструменты имеют аналогичную опцию, но я не уверен, что эта опция доступна во всех дистрибутивах UNIX.
tboyce12

8
Работает и на Mac OS.
c.gutierrez

2
@ tboyce12 Работая над убунтом, я могу указать -regextype упростить регулярное выражение: find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
doub1ejack

1
@cjm Может быть find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. Использование -iregexфлага говорит findо том, что регистр не должен учитываться.
tboyce12

11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Это использует fileкоманду, чтобы попытаться распознать тип файла, независимо от имени файла (или расширения).

Если /path/toили имя файла содержит строку image, то приведенное выше может возвращать фиктивные совпадения. В этом случае я бы предложил

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

Извините, у меня был ошибочный клик, и я, по-видимому, не могу отменить отрицательное голосование ... :(
Марк Симпсон,

6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

2
Не могли бы вы объяснить, почему вы добавили (экранированные) скобки вокруг параметров name / iname?
Барт Клейнгельд

Есть ли причина для несоответствия? -iname *.jpg, -o -name *.jpeg, -o -iname *gifВсе они имеют немного другой формат.
Заброшенная корзина

если бы вы могли хотя бы объяснить различия с другими ответами.
Эль-Тиди

6

В дополнение к ответу @Dennis Williamson выше, если вы хотите, чтобы одно и то же регулярное выражение не чувствительно к регистру для расширений файлов, используйте -iregex:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log



-1

в случае, если файлы не имеют расширения, мы можем искать тип файла MIME

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

где (аудио | видео | matroska | mpeg) - MIME-типы регулярных выражений

& если вы хотите удалить их:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

или удалите все, кроме этих расширений:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

обратите внимание! ~ вместо ~

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.