Birden çok uzantı aramak için find komutunu kullanma


Yanıtlar:


152

-oFarklı parametreler arasındaki bayrağı kullanın .

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) tıkır tıkır çalışıyor.

NOT Orada gerekir parantez ve içeriğini arasında bir boşluk olabilir ya da çalışmaz.

Açıklama:

  • type -f - yalnızca dosyaları arayın (dizinleri değil)
  • \(- type -fTüm argümanlara başvurmak için gerekli
  • -o - mantıksal VEYA operatörü
  • -iname- gibi -name, ancak maç büyük / küçük harfe duyarsız

Parantezlere mi ihtiyacınız var? Bu emir onlarsız benim için çalışıyor. Bazı mermiler için gerekli mi?
MikeD

2
@miked Komut onlar olmadan "çalışacak", evet, ama .png ile biten ve tam olarak amaçlanan değildir.
Shadur

1
Aydınlattığın için teşekkürler! type -fUzatmak ve parantez olmadan hem ifadeler için geçerli Yani gelmez find ./ -type f -iname \*.jpg -o -type f -iname \*.pngdaha uzun :-) iki karakter olsa ... da çalışır
miked

2
Operatör önceliği meselesi. Tıpkı a * b + cfarklı olduğu gibia * (b + c)
Shadur

2
jdhao İyi yakalandı, değiştirildi.
Shadur

86

Sen ile kriterlerini birleştirebilirsiniz -oolarak shadur önerdiği . -oYan yana sıralamaya göre daha düşük önceliğe sahip olduğunu unutmayın , bu nedenle parantez içine ihtiyacınız olabilir.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

Linux'ta -regexuzantıları başka bir yolla birleştirmek için kullanabilirsiniz . Varsayılan regexp sözdizimi Emacs'dir ( temel regexps artı değişme gibi birkaç uzantı \|); genişletilmiş regexps geçiş yapmak için bir seçenek var .

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

FreeBSD, NetBSD ve OSX'te genişletilmiş regexps -regexile birlikte kullanabilirsiniz -E.

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

Kullanımı her zaman daha iyi -inameyerine -nameo zaman da yakalayacaktır - image.JPGveimage.PnG
ccpizza

40

Bu daha doğru:

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

10
Neden "daha" doğru olduğunu söylüyorsun?
Kevin

2
Çünkü sanırım @Kevin -iregexmaçları jpgyanı sıra JPG Jpg jpGve bu tür. Ben $gerekli olmadığını düşünüyorum .
ott--

Bu MinGW üzerinde iyi çalışıyor .
Peter Mortensen

2
İlk önce, arama klasörünü bir hata atacak ilk argüman olarak atladınız. İkincisi, OSX'den kaçarken parantez çalışmaz ve bunun yerine kullanılmalıdır: find -E . -iregex '.*\.(jpg|png|gif)'@ sorin'in cevabında gösterildiği gibi.
ccpizza

8

Netleştirmek için, Linux, Unix ve macOS tadı üzerinde çalışan tek seçenek:

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

Bunun nedeni, OS X sürümünün biraz farklı olması, ancak çoğu platformda iyi giden şeyler yazmak için önemlidir.


2
-E bayrağı Ubuntu
14.04'te

-E bayrağı geçerli değildir MinGW (en azından sürüm / yapılandırma Belirli bir versiyonu için (varsayılan yapılandırmaya) üzerinde denedim) ya.
Peter Mortensen

-type f \( -iname \*.png -o -iname \*.jpg\)OSX'te hangi kısmı çalışmıyor?
Shadur

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.