Yalnızca bir dosya türüne sahip tüm dizinleri bul


-1

.Txt bir dosya türüne göre, yalnızca bu dosya türüne sahip olan tüm dizinleri bulun.

Örneğin

a--
   b-- 1.txt
   c--
      |
       ---- 2.jpg
       ---- 3.txt

Sadece komut vermelidir b değil c.


Lütfen bir işletim sistemi etiketi ekleyin. Linux için: Muhtemelen koşardım 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.
dirkt

Yanıtlar:


1
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.
  • Yeni hatları olan yollar (varsa) kandırılacak 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.
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.