Saya perlu mencari direktori kosong untuk daftar direktori tertentu. Beberapa direktori memiliki direktori di dalamnya.
Jika di dalam direktori juga kosong, saya dapat mengatakan direktori utama kosong jika tidak, tidak kosong.
Bagaimana saya bisa menguji ini?
Sebagai contoh:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Jawaban:
Periksa apakah
find <dir> -type f
menghasilkan sesuatu. Berikut contohnya:for dir in A B C; do [ -z "`find $dir -type f`" ] && echo "$dir is empty" done
sumber
-type f
.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- dan menjalankan kode dalam jawaban saya, ia melaporkan bahwa B dan C kosong, seperti yang diminta oleh OP. Jadi, Anda harus sedikit lebih spesifik daripada, "itu tidak akan berhasil".Itu sedikit tergantung pada apa yang ingin Anda lakukan dengan direktori kosong. Saya menggunakan perintah di bawah ini ketika saya ingin menghapus semua direktori kosong di dalam pohon, katakanlah
test
direktori.find test -depth -empty -delete
Satu hal yang perlu diperhatikan tentang perintah di atas adalah perintah tersebut juga akan menghapus file kosong , jadi gunakan opsi -type d untuk menghindarinya.
find test -depth -type d -empty -delete
Lepaskan
-delete
untuk melihat file dan direktori yang cocok.Jika definisi Anda tentang pohon direktori kosong adalah tidak berisi file, maka Anda dapat menyatukan sesuatu berdasarkan apakah
find test -type f
mengembalikan sesuatu.find
adalah utilitas yang hebat, dan RTFM lebih awal dan sering untuk benar-benar memahami seberapa banyak yang dapat dilakukannya :-)sumber
-empty
, sangat nyaman!find test -name ".DS_Store" -delete
dulu, lalu-empty delete
perintah. Perhatikan juga, suka kepushd
direktori induk, sehinggafind test
menjadifind .
, tetapi perintah lainnya sama.-depth
sini yaitu Penyebab find untuk melakukan traversal kedalaman pertama, yaitu direktori dikunjungi dalam urutan pasca dan semua entri dalam direktori akan dijalankan sebelum direktori itu sendiri. Saya pikir itu relevan di sini.Anda dapat menggunakan perintah berikut:
find . -type d -empty
sumber
find directory -mindepth 1 -type d -empty -delete
Ini adalah versi yang menurut saya paling menarik. Jika dijalankan dari dalam direktori , maka akan menghapus semua direktori kosong di bawah ini (direktori dianggap kosong jika hanya berisi direktori kosong).
Opsi mindepth mencegah direktori itu sendiri dihapus jika ternyata kosong.
sumber
rmdir --ignore-fail-on-non-empty -p directory
menyingkirkan orang tua juga.find . -type d -empty
menemukan dan mencantumkan direktori dan sub-direktori kosong di pohon saat ini. Misalnya daftar yang dihasilkan dari dirs dan subdir yang kosong:
Tidak ada operasi yang dilakukan pada direktori. Mereka hanya terdaftar. Ini berhasil untuk saya.
sumber
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 padafind
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 perintahrmdir
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
miripfind -maxdepth 0
dengan menggunakan lebih sedikit karakterfind -type d
mencetak direktori sajafind -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.sumber
rmdir -vp
sangat membantu saya karena saya tidak hanya perlu menghapus semua direktori kosong di bawah root, tetapi juga memeriksa direktori kosong dan direktori induk setelah menghapus file. Dalam situasi saya dirs kosong baik-baik saja selama mereka tidak ada di pohon tempat saya saat ini menghapus file. Terima kasih!Fungsi rekursif ini sepertinya berhasil:
# Bash findempty() { find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir do if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null then findempty "$dir" echo "$dir" fi done }
Diberikan contoh struktur direktori ini:
Hasil dari menjalankan fungsi itu adalah:
yang meleset
/dir4/dirD
. Jika Anda memindahkan panggilan rekursiffindempty "$dir"
setelahfi
, fungsi tersebut akan menyertakan direktori tersebut dalam hasilnya.sumber
Bagaimana dengan
rmdir *
? Perintah itu akan gagal pada direktori yang tidak kosong.sumber
rmdir */*/* */* *
Meskipun itu tidak menangani 'file-dot' tetapi kemudian dalam situasi manual (membersihkan file data) Anda biasanya tidak mengharapkan 'file-dot'. Metode rekursif, bagaimanapun, adalah untuk pembersihan umum yang lebih otomatis, terutama dalam struktur direktori yang sangat besar.Perintah berikut mengembalikan 1 jika direktori kosong (atau tidak ada) dan 0 sebaliknya (sehingga dimungkinkan untuk membalikkan kode pengembalian dengan
!
skrip shell):find $dir -type d -prune -empty -exec false {} +
sumber
Saya membuat struktur sederhana sebagai berikut:
test/ test/test2/ test/test2/test2.2/ test/test3/ test/test3/file
The
test/test3/file
berisi beberapa teks sampah.Menerbitkan
find test -empty
mengembalikan "test/test2/test2.2
" sebagai satu-satunya direktori kosong.sumber
pendekatan sederhana adalah,
$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"
juga,
if [ "$(ls -A /path/to/direcory)" ]; then echo "its not empty" else echo "empty directory"
sumber
find . -name -type d -ls |awk '($2==0){print $11}'
sumber