Listeden uzantıya sahip tüm dosyaları bulmak için find komutu nasıl kullanılır?


179

Dizindeki tüm resim dosyalarını bulmam gerekiyor (gif, png, jpg, jpeg).

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

Bu dizeyi yalnızca .jpg dosyalarını bulmak için nasıl değiştirebilirim?

Yanıtlar:


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

6
Mac'te benim için çalışmıyor, ancak -E (genişletilmiş) seçeneğiyle çalışır (belki de boru genişletilmiş bir özelliktir?): -E / yol / -iregex'e ". * \. (Jpg | gif | png | jpeg) "> log
ling

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

çalışacak. Daha zarif bir yol olabilir.


16
-iname büyük / küçük harfe duyarsız olur
Chris Koston

1
@Gerald: Büyük olasılıkla OR ifadenizi kaçan parantez içinde gruplamanız gerekir: find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;aksi takdirde exec yalnızca son kısım için geçerlidir ( -iname '*.jpg' bu durumda).
sonraki duyuruya kadar duraklatıldı.

Bu önemli bir açıklama. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0sadece jpg dosyalarını basacaktır! Burada parantez gerekiyor:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum

28

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

-ESenin regex parens ve boruları kaçmaya gerek kalmaz.


2
benim bulmam bu -E
wieczorek1990

1
Hmmm -Eseçeneği find"genişletilmiş düzenli ifadeler" kullanmayı söyler . Diğer birkaç aracın benzer bir seçeneği vardır, ancak bu seçeneğin tüm UNIX dağıtımlarında mevcut olduğundan emin değilim.
tboyce12

8
Mac OS'de de çalışır.
c.gutierrez

2
@ tboyce12 Ubuntu üzerinde çalışırken, regex ifadesini basitleştirmek için -regextype belirtebilirim find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
doub1ejack

1
@cjm Belki find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. -iregexBayrağın kullanılması büyük / findküçük harfe eşleşmemesini söyler .
tboyce12

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

Bu file, dosya adına (veya uzantısına) bakılmaksızın dosya türünü tanımayı denemek için komutu kullanır .

Eğer /path/to yoksa bir dosya adı dizesi içerir imageve ardından yukarıdaki sahte hit döndürebilir. Bu durumda,

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

Üzgünüm, orada bir hatalı vardı ve görünüşe göre downvote geri alamıyorum ... :(
Mark Simpson

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

2
Ad (iname) parametrelerine neden (çıkış karakterli) parantez eklediğinizi açıklayabilir misiniz?
Bart Kleijngeld

Tutarsızlığın bir nedeni var mı? -iname *.jpg, -o -name *.jpeg, -o -iname *gifTüm biraz farklı bir biçime sahiptir.
Terk Edilmiş Sepet

en azından diğer cevaplarla olan farklılıkları açıklayabilirseniz.
el-teedee

6

Yukarıdaki @ Williamson Williamson'ın yanıtına ek olarak, aynı normal ifadenin dosya uzantılarına büyük / küçük harfe duyarlı olmamasını istiyorsanız, -iregex kullanın:

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

5

Mac OS kullanımında

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"


-1

dosyalarda uzantı yoksa dosya mime türünü arayabiliriz

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

nerede (ses | video | matroska | mpeg) mime türleri normaldir

& silmek isterseniz:

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

veya bu uzantılar dışındaki her şeyi silin:

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

~ yerine! ~ dikkat edin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.