Temukan saja dirs kosong
Untuk menemukan direktori kosong (seperti yang ditentukan dalam judul pertanyaan), jawaban mosg benar:
find -type d -empty
Tetapi -empty
mungkin tidak tersedia pada find
versi yang sangat lama (ini adalah kasus HP-UX misalnya). Jika ini kasus Anda, lihat teknik yang dijelaskan di bagian di bawah ini Apakah direktori kosong? .
Hapus direktori kosong
Ini agak rumit: Misalkan sebuah direktori MyDir
berisi direktori kosong. Setelah menghapus direktori kosong tersebut, MyDir
akan menjadi direktori kosong dan juga harus dihapus. Oleh karena itu saya menggunakan perintah rmdir
dengan opsi --parents
(atau -p
) yang juga menghapus direktori induk bila memungkinkan:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Pada find
versi yang lebih lama , pernyataan +
tersebut belum didukung, oleh karena itu Anda dapat menggunakan ;
:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Apakah direktori kosong?
Sebagian besar jawaban ini menjelaskan cara memeriksa apakah direktori kosong. Oleh karena itu saya berikan di sini tiga teknik berbeda yang saya ketahui:
[ $(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
variasi:
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
Penjelasan:
find -prune
mirip find -maxdepth 0
dengan menggunakan lebih sedikit karakter
find -type d
mencetak direktori saja
find -empty
mencetak direktori dan file kosong
> 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} ))
Trik ini 100% bash
tetapi memanggil (memunculkan) sub-shell. Ide ini dari Bruno De Fraine dan ditingkatkan dengan komentar teambob . Saya menyarankan yang ini jika Anda menggunakanpesta dan jika script Anda tidak harus portabel.
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
catatan: tidak ada perbedaan antara direktori kosong dan yang tidak ada (dan bahkan jika jalur yang diberikan adalah file).
[ $(ls -A your/dir) ]
Trik ini terinspirasi dari artikel nixCraft yang diposting pada tahun 2007. Andrew Taylor menjawab pada 2008 dan gr8can8dian pada 2011.
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
atau versi bashism satu baris:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Catatan: ls
kembali $?=2
jika direktori tidak ada. Tetapi tidak ada perbedaan antara file dan direktori kosong.