Birden çok uzantı tarafından filtrelenen dosyaları bulun


52

Bunun için doğru sözdizimi nedir:

find . -type f -name \*.\(shtml\|css\)

Bu işe yarar, ancak inelegant:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Aynısını nasıl yapmalı, ancak daha az tuş vuruşuyla?

Yanıtlar:


75

Farklı arama ifadelerini mantıksal operatörlerle birleştirebilir -orveya -anddurumunuzu şöyle yazabilirsiniz.

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Bu ayrıca, tırnak işareti kullanırken özel kabuk karakterlerinden kaçmanız gerekmediğini de gösterir.

Düzenle

Yana -orima daha düşük önceliğe sahiptir -andarasında -typeve birinci -nameChris tarafından önerildiği gibi parantez içine koymak adı parçası.


Bu da "* .css" adlı dizinleri basacaktır.
Teddy

Hmm, güncellenmiş versiyonunuzdaki parantezler biraz yanlış yerleştirilmiş. Bireysel parantezler ayrı parametreleri olarak sona gerekir bulmak çevrelerindeki boşluk ( ' "gerekir, böylece, Css")' tek bir dize değeri sonuçları; (eg) `' .css)' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name` ile aynıdır, 'operand' ile değil.
Chris Johnsen


12

Yalnızca dosya eklemek için parantez içine almanız gerekir:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Bonus : Bu POSIX uyumlu sözdizimidir.


4

Sık sık kendimi daha karmaşık filtreler için egrep ya da daha uzun borular ya da perl kullanarak bitirdim:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Biraz daha az etkili olabilir, ancak bu genellikle bir endişe değildir ve daha karmaşık işler için inşa edilmesi ve değiştirilmesi genellikle daha kolaydır.

Standart uyarı, bunun garip dosya isimlerindeki dosyalar için kullanılmaması için geçerlidir (örn. Yeni satırlar içeren).


Temiz ve modüler bir çözüm için +1 olarak, performans darboğazları genellikle arama sonuçlarından elde edilen dosyaları işlerken ortaya çıkar.
Cristik
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.