belirli bir düzenle eşleşen tüm dosyaları bulmak:Recursively bu kalıpla eşleşen tüm dosyaları bulmak (veya daha spesifik olarak saymak) gerek
*/foo/* doc
Nerede birinci Joker yıldız değişken sayıda alt dizin içerir.
belirli bir düzenle eşleşen tüm dosyaları bulmak:Recursively bu kalıpla eşleşen tüm dosyaları bulmak (veya daha spesifik olarak saymak) gerek
*/foo/* doc
Nerede birinci Joker yıldız değişken sayıda alt dizin içerir.
sen (-name
aksine) tüm yolu eşleşmesi normal ifadeler kullanabilirsiniz bulmak find
dosya adı yerine inode numarasını yazdırmak için, dosya adından farklı olarak inode numarası bir satırsonu gibi karakterlere sahip olmadığından garantilidir, bu nedenle sayma daha güvenilirdir.Teklif için @tripleee'ye teşekkürler.
Bunun OSX üzerinde çalışıp çalışmayacağını bilmiyorum.
Bunun sonuna "| wc -l" ekleyin ve mükemmel. – pw222
nasıl:
find BASE_OF_SEARCH/*/foo -name \*.doc -type f | wc -l
Bu ne yapıyor: dizin BASE_OF_SEARCH de
Bu yöntemin faydası f: Bir senaryoya eklerseniz
UPDATE: değişken derinlik ister misiniz? Tamam: * .doc
find BASE_OF_SEARCH -name \*.doc -type f | grep foo | wc -l
İsteğe bağlı olarak, dosyada "foo" yazan sonuçları filtreleyebilirsiniz. isim, çünkü bunlar da gösterecek.
Bu, BASE_OF_SEARCH ve foo arasındaki değişken alt dizin derinliği ile çalışmadığı durumlar dışında çalışır. Belki de bu şartnameyle yeterince açık değildim. Yaptığım görevi yerine getirebildiğim için yeterince yakınım, bu yüzden bir bağış ve teşekkür ederim. – pw222
Yinelemeli olmadığını vurgulamalıdır. Ancak, bu genellikle gerekli değildir. O zaman bu bir simpe ve hoş bir çözümdür. Performans sorunları olsa da - bilmiyorum. – robsch
İsteklerinize bir özellik ekledim – MonkeyWidget
Untested, ancak deneyin:
find . -type d -name foo -print | while read d; do echo "$d/*.doc" ; done | wc -l
(değişen derinliklerde) Tüm "foo" dizinleri bulmak (bu sembolik yok sayar, bu şekilde ekleyebilirsiniz sorunun bir parçası ise); Tüm ".doc" dosyalarını bulmak için kabuk globbing kullanın, sonra onları sayın.
find . -regex '.*/foo/[^/]*.doc' -printf '%i\n' | wc -l
(%i
biçim kodu nedenler:
find . -regex '.*/foo/[^/]*.doc'
sadece dosya sayısını saymak için: GNU'da ile
'while' döngüsü tamamen gereksiz ve biraz hataya eğilimlidir. Ayrıca, alıntı yapıldığı için joker karakteri genişletilmez. Sadece "bul -print" yi "wc -l" ye çevir. Ancak, bir dosya adı bir satırsonu içeriyorsa, bu yanlış sayımı yine de verecektir. – tripleee
Bash olmak zorunda mı? zsh, 'ls **/foo/*. doc' adlı sözdizimini kullanarak bunu yapabilir. – Alastair
Alastair, öneri için teşekkürler. Zsh ve çift-asterik sözdiziminin farkında değildim. İlginç olarak, sonuçta ortaya çıkan argüman listesinin ls (yaklaşık 6000 dosya adı) için çok uzun olduğu ve bir hata verdiğini görüyoruz. – pw222
Bash v4 ayrıca “**” özyineli globunu da destekler. – tripleee