Pertanyaan Apakah ada cara yang lebih cepat untuk menghapus direktori daripada "rm -rf"?


Saya memiliki folder yang memiliki banyak file dan "rm -rf" membutuhkan banyak waktu untuk menyelesaikannya. Apakah ada cara yang lebih cepat untuk menghapus direktori dan isinya (subdir, dll)?


23
2018-03-22 01:31


asal


Bagi siapa saja yang tertarik melihat: slashroot.in/comment/1286#comment-1286 temukan trumps perl trumps rsync - Rinzwind


Jawaban:


Anda dapat mencoba memutus tautan inode untuk direktori tetapi itu akan meninggalkan Anda dengan beban penuh file yatim piatu itu fsck  akan  berbalik.

rm sebagus yang didapatnya.


Beberapa orang menyebutkan kasus tepi di mana beberapa hal lebih cepat daripada yang lain. Tapi mari kita pastikan kita membandingkan versi terbaik dari hal yang sama.

Jika Anda ingin menghapus direktori dan semua yang ada di dalamnya, saya menyarankan Anda:

rm -rf path/to/directory

rm akan secara internal daftar file dan direktori yang akan dihapus. Dan itu semua terkompilasi C. Dua alasan itu adalah yang tercepat.

Ini sangat jelas bukan hal yang sama rm -rf path/to/directory/* yang mana akan memperluas pada tingkat shell dan mengirimkan banyak argumen ke dalamnya rm. Kemudian rm harus menguraikannya dan kemudian mengulanginya dari masing-masing. Itu jauh lebih lambat.

Sama seperti "patokan" yang membandingkan find path/to/directory -exec {} \; itu tidak masuk akal. Itu berjalan rm sekali per file yang ditemukannya. Sangat lambat. Temukan argumen perintah build gaya xargs dengan -exec rm {} + tapi itu hanya sepelan ekspansi. Anda bisa menelepon -delete yang menggunakan internal unlink panggil ke kernel (seperti rm tidak) tetapi itu hanya akan bekerja untuk file pada awalnya.

Jadi untuk mengulang, kecuali Anda melempar disk ke dalam cairan magma panas, rm adalah raja.


Pada catatan terkait, filesystem yang berbeda menghapus hal-hal pada tingkat yang berbeda karena bagaimana mereka terstruktur. Jika Anda melakukan ini secara rutin Anda mungkin ingin menyimpan file-file ini dalam sebuah partisi yang diformat dalam XFS yang cenderung menangani penghapusan cukup cepat.

Atau gunakan disk yang lebih cepat. Jika Anda memiliki banyak RAM, gunakan /dev/shm (sebuah disk RAM) bisa menjadi ide.


25
2018-03-22 01:48



Anda tidak bisa benar-benar menggunakan unlink system call pada direktori (Anda akan mendapatkan EISDIR kesalahan), sehingga opsi pertama tidak dimungkinkan. - James Henstridge
Apakah mv to / tmp menjadi lebih cepat? Tampaknya mv membutuhkan banyak waktu juga. - Mohammad Moghimi
@MohammadMoghimi: mving antara filesystem / partisi yang berbeda berarti a cp diikuti oleh rm. - enzotib
@enzotib Namun, jika /tmp ada di filesystem yang sama, aku bertanya-tanya jika mvdan restart akan lebih cepat? Saya tidak yakin jika /tmp dibersihkan menggunakan rm bagaimanapun. - Sparhawk


Terkadang, find $DIR_TO_DELETE -type f -delete lebih cepat daripada rm -rf.

Anda mungkin juga ingin mencoba mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

Akhirnya, jika Anda perlu menghapus konten dari keseluruhan partisi, kemungkinan tercepat adalah umount, mkfs dan kembali mount.


7
2018-04-12 13:53





Jika Anda tidak memerlukan ruang kosong, cara tercepat adalah dengan menunda penghapusan dan melakukannya di latar belakang:

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone .delete_me

Kemudian memiliki crontab yang melakukannya di latar belakang, pada waktu tenang, dengan pro / I / O rendah:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Catatan:

  • periksa output Anda sebelum menghapus gema di crontab!
  • direktori .delete_me harus berada di filesystem yang sama - jika tidak jelas bagi semua orang.

Memperbarui: Saya menemukan trik yang rapi untuk menjalankan beberapa rm secara paralel - ini akan membantu jika Anda memiliki array disk besar:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • -teknik untuk melakukan traversal dalam-kedalaman.

  • -maxdepth untuk membatasi kedalaman traversal direktori sehingga kita tidak berakhir mendengarkan file individual.

  • -d \ n untuk menangani spasi dalam nama file.

  • -P dan -n menangani derajat paralelisme (periksa manpage).

ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

Perbarui 2 (2018): Dengan ZFS dikirim dengan Ubuntu 18.04 saya menggunakannya untuk segala sesuatu dan saya akan membuat yang baru kumpulan data untuk proyek besar apa pun. Jika Anda merencanakan ke depan dan melakukan ini sebelumnya, Anda dapat dengan mudah "zfs menghancurkan" sebuah filesystem ketika Anda selesai. ;-)

Saya menggunakan instruksi dari wiki zfsonlinux untuk menginstal Ubuntu ke ZFS secara asli: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS


4
2018-03-08 23:12



Alih-alih perintah terakhir, gunakan find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. Itu -depth opsi memberi tahu find daftar anak-anak terlebih dahulu. - muru


Saya pikir masalahnya adalah tidak ada cara sempurna untuk menghapus direktori yang sangat besar dan seluruh isi kontennya tanpa sistem pengarsipan terindeks yang benar yang mengerti memutuskan tautan dan tidak berarti ia berpikir telah kehilangan file ala FSCK. Harus ada kepercayaan.

Sebagai contoh, saya memiliki zoneminder berjalan untuk berbagai golf. Saya membuat serangan linux sebesar 1,5 TB untuk menangani data dalam jumlah besar yang dia tangkap sehari (12 feed kamera) bagaimana dia berlari pada drive 120 GB di luar saya. Singkat cerita, folder untuk semua data yang diambil adalah sekitar 1,4 TB penyimpanannya. Banyak untuk dibersihkan

Setelah menginstal ulang ZM dan membersihkan perpustakaan tua 1,4 TB tidak menyenangkan karena dapat memakan waktu 1 - 2 hari untuk menghapus gambar lama.

FS terindeks yang benar memungkinkan drop direktori dan mengetahui bahwa data di bawahnya mati dan nol keluar dari data adalah pemborosan waktu dan sumber daya PC. Ini harus menjadi opsi untuk menghapus data yang dihapus. RM hanya butuh waktu lama di dunia nyata di ext4.

Menjawab: Secara rekursif membatalkan tautan semua file akan lebih cepat sedikit tetapi Anda masih harus menyisihkan waktu untuk menjalankan FSCK.

Buat skrip yang menjalankan perintah "UNTUK" rekursif yang dapat "menghapus" semua file di bawah folder Anda kemudian hanya rm atau rmdir semua folder untuk membersihkannya. Jalankan FSCK secara manual untuk meniadakan sisa data ketika nyaman. Agak malas tidak menulisnya maaf :).


1
2018-06-24 18:00





Meskipun tidak berguna jika Anda ingin membersihkan direktori yang ada, saya akan menyebutkan bahwa strategi yang mungkin jika Anda tahu Anda akan memiliki direktori dengan lof file yang perlu Anda bersihkan secara teratur adalah dengan meletakkan direktori pada sistem filenya sendiri (misalnya, partisi). Kemudian ketika Anda perlu membersihkannya, lepaskan, jalankan a mkfs, dan remount. Sebagai contoh OpenBSD menyarankan untuk melakukan ini untuk /usr/obj, di mana banyak file dibuat saat membangun sistem, dan harus dihapus sebelum membangun berikutnya.


0
2018-03-29 10:17