Bagaimana saya bisa menghapus semua direktori kosong di subtree? Saya menggunakan sesuatu seperti
find . -type d -exec rmdir {} 2>/dev/null \;
tapi saya perlu dijalankan beberapa kali untuk menghapus direktori yang berisi direktori kosong saja. Selain itu, ini sangat lambat, terutama di bawah cygwin.
Jawaban:
Menggabungkan
find
opsi dan predikat GNU , perintah ini harus melakukan pekerjaan:-type d
membatasi ke direktori-empty
membatasi ke yang kosong-delete
menghapus setiap direktoriPohon itu berjalan dari daun tanpa perlu menentukan
-depth
seperti apa yang tersirat-delete
.sumber
-delete
sudah tersirat-depth
sehingga Anda tidak perlu menentukannya secara manual.-mindepth 1
sini, untuk mencegah menghapus direktori awal itu sendiri, jika itu akan kosong.!
memiliki arti khusus untuk shell. Anda harus menghindarinya. Sesuatu seperti:\! -name 'Completed'
sesaat sebelum-delete
harus bekerja. Atau Anda cukup meletakkan file marker di direktori ini.Daftar direktori bersarang-pertama.
(Perhatikan bahwa pengalihan berlaku untuk
find
perintah secara keseluruhan, tidak hanya untukrmdir
. Mengarahkan hanya untukrmdir
akan menyebabkan perlambatan yang signifikan karena Anda harus meminta shell perantara.)Anda dapat menghindari menjalankan
rmdir
direktori yang tidak kosong dengan melewati-empty
predikat untuk menemukannya. GNU menemukan menguji direktori ketika hendak menjalankan perintah, sehingga direktori yang baru saja dikosongkan akan diambil.Cara lain untuk mempercepat adalah mengelompokkan
rmdir
doa. Keduanya cenderung lebih cepat dari aslinya, terutama di bawah Cygwin. Saya tidak berharap banyak perbedaan antara keduanya.Metode mana yang lebih cepat tergantung pada berapa banyak direktori kosong yang Anda miliki. Anda tidak dapat menggabungkan
-empty
dengan metode untuk mengelompokkan doa, karena direktori yang hanya berisi direktori kosong tidak kosong pada saatfind
melihatnya.Metode lain adalah dengan menjalankan beberapa lintasan. Apakah ini lebih cepat tergantung pada banyak hal, termasuk apakah seluruh hierarki direktori dapat tetap ada di cache disk antara proses
find
.Atau, gunakan zsh. The kualifikasi gumpal
F
cocok direktori yang tidak kosong, sehingga/^F
cocok direktori kosong. Direktori yang hanya berisi direktori kosong tidak dapat dicocokkan dengan mudah.(Ini berakhir ketika
rmdir
menerima baris perintah kosong.)sumber
-p
? Saya tidak akan berpikir itu akan membuat perbedaan.-empty
harus bekerja dengan yang satu ini (walaupun saya tidak yakin persis berapa banyak yang akan didapat). Dan sangat, sangat sepele, karena Anda mungkin tidak ingin menghapus.
, gunakan-mindepth 1
.-depth
argumen, yang membuatrmdir -p
tidak berguna. Saya sudah mengubah komentar saya. 90-an adalah upaya awal saya; tidak ada yang mengejutkan di sini.rmdir
panggilan perintah sama sekali, setidaknya dengan GNU find, dengan perintah ini:find . -depth -type d -empty -delete
Jika Anda hanya menempelkannya
-p
pada Andarmdir
, itu akan bekerja dalam satu pass. Tidak akan cantik atau optimal, tetapi harus mendapatkan segalanya. Itu memberitahu rmdir untuk menghapus direktori induk yang tidak kosong dari direktori yang Anda hapus.Anda dapat menyimpan sedikit dengan menambahkan
-empty
tes untuk menemukan, sehingga tidak mengganggu dengan direktori yang tidak kosong.sumber
find . -depth -type d -exec rmdir {} +
adalah jawaban yang paling sederhana dan sesuai standar untuk pertanyaan ini.
Sayangnya, jawaban lain yang diberikan di sini tergantung pada perangkat tambahan khusus vendor yang tidak ada pada semua sistem.
sumber
find . -type d -printf "%d %p\n" |\ sort -nr |\ perl -pe 's/^\d+\s//;' |\ while read dir; do \ (rmdir "$dir" > /dev/null 2>&1); \ done
Begini cara kerjanya:
rmdir
pada daftar satu per satusumber
Saya menggunakan alias ini untuk
find
perintah yang sering digunakan , terutama ketika saya membersihkan ruang disk menggunakan dupeguru , di mana menghapus duplikat dapat menghasilkan banyak direktori kosong.Komentar di dalam
.bashrc
jadi saya tidak akan melupakannya nanti ketika saya perlu mengubahnya.sumber
rm -r */
perintah bekerja dengan mudah untukku.rm
harus mengharuskan-f
untuk menghapus direktori dengan file dengan paksa.rm -r
seharusnya hanya menghapus direktori kosong. Saya terbuka mengapa ini bisa salah. Ini juga harus meninggalkan file karena*/
hanya melihat folder.sumber
rm
terutama dimaksudkan untuk menghapus file. Meskipun*/
hanya cocok dengan direktori, saya tidak tahu apa fungsinya di level yang lebih dalam. Saya juga bisa membayangkan bahwa itu hanya bekerja pada beberapa sistem.