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

118

Мне нужно найти все файлы изображений из каталога (gif, png, jpg, jpeg).

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

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

Теги:
find

8 ответов

108
Лучший ответ
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
  • 6
    У меня не работает на Mac, но работает с опцией -E (расширенная) (может быть, канал является расширенной функцией?): Find -E / path / to -iregex ". * \. (Jpg | gif | png | jpeg) "> log
92
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -o -iname '*.png' -o -iname '*.jpeg'

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

  • 15
    - имя будет нечувствительным к регистру
  • 0
    Кажется, что exec не работает таким образом.
Показать ещё 1 комментарий
15

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

-E избавляет вас от необходимости избегать появления парсеров и труб в вашем регулярном выражении.

  • 2
    моя находка не имеет этого -E
  • 1
    Хммм, опция -E указывает find использовать «расширенные регулярные выражения». Некоторые другие инструменты имеют аналогичную опцию, но я не уверен, что эта опция доступна во всех дистрибутивах UNIX.
Показать ещё 4 комментария
10
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/
  • 0
    Извините, там был ошибочный клик, и я, по-видимому, не могу отменить понижение ... :(
6

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

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
4
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
  • 1
    Не могли бы вы объяснить, почему вы добавили (экранированные) скобки вокруг параметров name / iname?
  • 0
    Если вы добавите команду удаления - тогда это будет иметь смысл.
Показать ещё 1 комментарий
1
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
0

В Mac OS используйте find -E packages -regex ".*\.(jpg|gif|png|jpeg)"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню