Sadece boş dizinler bulun
Sadece boş dizinler bulmak için (soru başlığında belirtildiği gibi), mosg'ın cevabı doğrudur:
find -type d -empty
Ancak -empty
çok eski find
sürümlerde mevcut olmayabilir (örneğin bu HP-UX durumudur ). Durumunuz buysa, aşağıdaki Bir dizin boş mu? Bölümünde açıklanan tekniklere bakın. .
Boş dizinleri silin
Bu biraz karmaşık: Bir dizinin MyDir
boş dizinler içerdiğini varsayalım . Bu boş dizinler kaldırıldıktan sonra boş bir dizin MyDir
haline gelecektir ve ayrıca kaldırılması gerekir. Bu nedenle , mümkün olduğunda ana dizinleri de kaldıran (veya ) rmdir
seçeneğiyle komutu kullanıyorum :--parents
-p
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Daha eski find
sürümde ifade +
henüz desteklenmemektedir, bu nedenle ;
bunun yerine kullanabilirsiniz :
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Bir dizin boş mu?
Bu cevapların çoğu, bir dizinin boş olup olmadığının nasıl kontrol edileceğini açıklar. Bu nedenle burada bildiğim üç farklı tekniği sunuyorum:
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir
if [ x$(find "$d" -prune -empty) = x"$d" ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
bir varyasyon:
d=your/dir
if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
then
echo "empty directory"
else
echo "contains files (or does not exist or is not a directory)"
fi
Açıklama:
find -prune
find -maxdepth 0
daha az karakter kullanmaya benzer
find -type d
yalnızca dizinleri yazdırır
find -empty
boş dizinleri ve dosyaları yazdırır
> mkdir -v empty1 empty2 not_empty
mkdir: created directory 'empty1'
mkdir: created directory 'empty2'
mkdir: created directory 'not_empty'
> touch not_empty/file
> find empty1 empty2 not_empty -prune -empty
empty1
empty2
(( ${#files} ))
Bu numara% 100'dür bash
ancak bir alt mermi çağırır (ortaya çıkarır). Fikir dan Bruno De Fraine ve geliştirilebilir teambob un yorumunu. Eğer kullanırsan bunu tavsiye ederimbash ve betiğinizin taşınabilir olması gerekmiyorsa.
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
Not: boş bir dizin ile mevcut olmayan bir dizin arasında fark yoktur (ve sağlanan yol bir dosya olsa bile).
[ $(ls -A your/dir) ]
Bu numara nixCraft'ın 2007'de yayınlanan makalesinden esinlenmiştir . Andrew Taylor , 2008'de ve gr8can8dian'da 2011'de cevap verdi .
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
veya tek satırlık bashizm versiyonu:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Not: dizin olmadığında ls
döner $?=2
. Ancak bir dosya ile boş bir dizin arasında hiçbir fark yoktur.