Bir Linux sisteminde, sadece klasörler içeren klasörler nasıl tekrarlanır bir şekilde bulunur?


0

Aynı düzeyde yalnızca bir veya daha fazla dizin içeren dizinleri öznitelikle bulan bir komut bulmaya çalışıyorum. Tercihen findkomut ile. Gibi find . -type d.

Örneğin, aşağıdaki dosya yapısında:

/tmp/folder1/folder1a/test.jpg
/tmp/folder1/file1a.tmp
/tmp/folder2/folder2a/test.jpg
/tmp/folder3/folder3a/
/tmp/folder3/folder3b/file.jpg

Vurmak istiyorum folder2ve folder3sadece dosya içermediği için sadece dosya içeriyor.

Yanıtlar:


3

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

Herhangi bir dosya içerenler hariç, boş olmayan klasörlerin listesi (içindeki en az bir şey). Ayrıca borular ve sembolik bağlantılar gibi şeyleri dışlamak istiyorsanız, ! -type dbunun yerine kullanabilirsiniz -type f. Bu, tek bir bulma deyiminde yapılamaz çünkü bulma karmaşık içerik ölçütleriyle eşleşemez (bu XPath değildir).


2

Seni doğru anlarsam, bunu yapmalı:

find . -type d ! -empty -exec sh -c '\
[ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\
' sh {} \; -print

Yüzünden -empty, -maxdepth, -mindepthve -quit, POSIX'deki hangilerinin, çözüm OS çalışmayabilir ( -print -quit; sadece bu parçayı atlayabilirsiniz, işleri hızlandırmak için -maxdepth 1 -mindepth 1olsa önemlidir).

İşin püf noktası, boş olmayan her dizin için ayrı bir kabuk çalıştırmaktır; bu, dizin herhangi bir dizin içermiyorsa denetler (özyinelemesiz). Bu ile yapılır -exec sh … \;, burada bir test görevi görür. Dizin olmayan dizin içermiyorsa bu durumda, iç çıkış findboş, bu nedenle test ( [ -z … ]) çıkış durumu ile döner 0, shdöner 0, -execgeçerlidir.

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.