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?
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:
Farklı arama ifadelerini mantıksal operatörlerle birleştirebilir -or
veya -and
durumunuzu şö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 -or
ima daha düşük önceliğe sahiptir -and
arasında -type
ve birinci -name
Chris tarafından önerildiği gibi parantez içine koymak adı parçası.
). 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.
İşte ilk versiyonunuzu yapmanın bir yolu:
find -type f -regex ".*/.*\.\(shtml\|css\)"
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).