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.