Як за допомогою команди 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: Ймовірно, вам потрібно буде згрупувати свій ІЛИ вираз у скоршених дужках: 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
Anne van Rossum,

28

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

Це -Eпозбавляє вас від необхідності уникати паронів і труб у вашому регексе.


2
у моєї знахідки немає цього -E
wieczorek1990,

1
Hmmm -Eопція пропонує findвикористовувати "розширені регулярні вирази". Кілька інших інструментів мають подібний варіант, але я не впевнений, що ця опція доступна у всіх дистрибутивах UNIX.
tboyce12

8
Працює і на Mac OS.
c.gutierrez

2
@ Tboyce12 Працюючи над Убунту, я можу вказати -regextype спростити регулярний вираз: find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
sum1ejack

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/

До жаль, був мандрівний клацання, і я , мабуть , не може скасувати downvote ... :(
Марк Сімпсон

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

2
Чи можете ви пояснити, чому ви додали круглі дужки навколо параметрів імені / iname?
Барт Клейнджельд

Якась причина невідповідності? -iname *.jpg, -o -name *.jpeg, -o -iname *gifВсі вони мають дещо інший формат.
Покинутий кошик

якби ви могли принаймні пояснити відмінності іншими відповідями.
el-teedee

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 regex

& якщо ви хочете видалити їх:

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.