Yanıtlar:
find . -type d -execdir sh -c '
[ "$(find "$1" -maxdepth 1 -type f -name "*.txt" -print -quit | wc -l)" -gt 0 ] &&
[ "$(find "$1" -maxdepth 1 -type f ! -name "*.txt" -print -quit | wc -l)" -eq 0 ]
' find-sh {} \; -print
Dış find İncelenecek dizinleri sağlar. İki iç find -En az biri olup olmadığını kontrol edin .txt dosya ve hayır .txt dizindeki dosyalar. sh Kabuk ile mantık uygular [ … ] ve &&.
Notlar:
-maxdepth POSIX tarafından gerekli değildir. POSIX yaklaşımı için bkz. bu soru . -quit POSIX tarafından gerekli değildir. Bu işlem yapar find Eşleşen herhangi bir dosya bildirilir bildirilmez. Faydalı bir sonuçtur çünkü sonucu elde etmek için en fazla bir eşleşen dosyaya ihtiyacımız var. wc -l ve [ … ], bu yüzden erken istifa etmek zaman kazandırır. olmadan -quit tüm komut işe yarayacak, birçok dosya olduğunda daha yavaş olacak. Alternatif olarak kullanabilirsiniz find … | head -n 1 | wc -l; bu durumda head ilk dosyayı bulduktan sonra boruyu sonlandıracak, wc sonucu hemen vereceğim, ancak find kırılan boruyu yalnızca (eğer) yazmaya çalıştığında fark eder Yine bir başka hat. Ve bu bir takas: head Size biraz zaman ve kaynak kazandırabilir, ancak (ayrı bir süreç olarak) her dizinde iki kez üretilmesi için zaman ve kaynak gerekir. wc -l fakat farketmez, çünkü bu ekstra yeni satırlar sayıma sadece “doğru” sayım sıfır değilse ekleyebilir ve sonucun sıfır olup olmadığını bilmemiz gerekir.
find, en azından bu tür bir dosyayı içeren aday dizinleri alın ve çıktıyı "sadece" koşulunu kontrol eden bir komut dosyasıyla işleyin.