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

32

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 (subdirs, dll)?

Mohammad Moghimi
sumber
Bagi siapa pun yang tertarik, lihat: slashroot.in/comment/1286#comment-1286 temukan truf perl truf rsync
Rinzwind

Jawaban:

33

Anda dapat mencoba memutuskan tautan inode untuk direktori tetapi itu akan memberi Anda banyak file yatim yang fsck akan dibalik.

rm sama baiknya dengan yang didapat.


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 sarankan Anda:

rm -rf path/to/directory

rmakan secara internal mencantumkan file dan direktori yang akan dihapus. Dan itu semua di dikompilasi C . Dua alasan itulah yang tercepat.

Ini sangat jelas bukan hal yang sama rm -rf path/to/directory/*yang akan berkembang pada level shell dan meneruskan banyak argumen rm. Maka rmharus mengurai mereka dan kemudian kambuh dari masing-masing Itu jauh lebih lambat.

Sama seperti "tolok ukur" yang membandingkan find path/to/directory -exec {} \;adalah omong kosong. Itu berjalan rmsekali per file yang ditemukannya. Sangat lambat. Temukan argumen perintah perintah build gaya xargs -exec rm {} +tapi itu sama lambatnya dengan ekspansi. Anda dapat memanggil -deleteyang menggunakan unlinkpanggilan internal ke kernel (seperti rmhalnya) tetapi itu hanya akan berfungsi untuk file pada awalnya.

Jadi ulangi, kecuali Anda membuang disk ke dalam cairan magma panas, rmadalah raja .


Pada catatan terkait, sistem file yang berbeda menghapus sesuatu dengan kecepatan yang berbeda karena bagaimana mereka terstruktur. Jika Anda melakukan ini secara teratur, Anda mungkin ingin menyimpan file-file ini di partisi yang diformat dalam XFS yang cenderung menangani penghapusan cukup cepat.

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

Oli
sumber
Anda tidak dapat benar-benar menggunakan unlinkpanggilan sistem pada direktori (Anda akan mendapatkan EISDIRkesalahan), sehingga opsi pertama tidak memungkinkan.
James Henstridge
Apakah mv ke / tmp lebih cepat? Tampaknya mv juga membutuhkan banyak waktu.
Mohammad Moghimi
@MohammadMoghimi: mving antara filesystem / partisi yang berbeda berarti cpdiikuti oleh a rm.
enzotib
3
@enzotib Namun, jika /tmpberada pada sistem file yang sama, saya bertanya-tanya apakah mvdan restart akan lebih cepat? Saya tidak yakin apakah /tmpsudah dibersihkan dengan menggunakan rm.
Sparhawk
1
rsyncdalam hal patokan ini lebih cepat dari rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos
11

Terkadang, find $DIR_TO_DELETE -type f -deletelebih cepat dari rm -rf.

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

Akhirnya, jika Anda perlu menghapus konten seluruh partisi, yang tercepat mungkin umount, mkfsdan kembali mount.

mivk
sumber
1
bukan type -funtuk menunjukkan file dan bukan direktori? juga, menambahkan -printmenunjukkan file saat mereka sedang dihapus.
leetbacoon
8

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

  • mkdir .delete_me
  • mv direktori-besar-itu-saya-ingin-hilang .delete_me

Kemudian miliki crontab yang melakukannya di latar belakang, pada waktu tenang, dengan proioritas I / O yang 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 sistem file yang sama - jika tidak jelas bagi semua orang.

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

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

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

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

  • -P dan -n menangani tingkat paralelisme (periksa halaman manual).

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

Pembaruan 2 (2018): Dengan ZFS yang dikirimkan dengan Ubuntu 18.04 saya menggunakannya untuk semuanya dan saya akan membuat dataset baru untuk proyek besar apa pun. Jika Anda berencana ke depan dan melakukan ini sebelumnya, Anda bisa "zfs menghancurkan" sebuah sistem file ketika Anda selesai. ;-)

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

Lester Cheung
sumber
2
Alih-alih perintah terakhir itu, gunakan find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. The -depthpilihan memberitahu findke daftar anak pertama.
muru
2

Saya pikir masalahnya adalah bahwa tidak ada cara yang sempurna untuk menghapus direktori yang sangat besar dan seluruh set isinya tanpa sistem pengarsipan yang benar yang memahami pembatalan tautan dan tidak berarti ia berpikir telah kehilangan file ala FSCK. Harus ada kepercayaan.

Sebagai contoh, saya menjalankan zoneminder untuk bermain golf. Saya membangun serangan linux 1,5 TB untuk menangani sejumlah besar data yang dia ambil sehari (12 umpan kamera) bagaimana dia berlari pada drive 120 GB berada di luar jangkauan saya. Singkat cerita folder untuk semua data yang diambil adalah sekitar 1,4 TB penyimpanannya. Banyak yang harus dibersihkan

Harus menginstal ulang ZM dan membersihkan perpustakaan lama 1,4 TB itu tidak menyenangkan karena bisa memakan waktu 1 - 2 hari untuk menghapus gambar yang lama.

FS yang diindeks benar memungkinkan drop direktori dan tahu bahwa data di bawahnya sudah mati dan nolnya data adalah buang-buang waktu dan sumber daya PC kita. Ini harus menjadi opsi untuk tidak menghapus data yang dihapus. RM hanya butuh waktu lama di dunia nyata pada ext4.

Jawaban: Membatalkan semua file secara rekursif akan lebih cepat secara marginal tetapi Anda masih harus menyisihkan waktu untuk menjalankan FSCK.

Buat skrip yang menjalankan perintah "FOR" rekursif yang dapat "membatalkan tautan" semua file di bawah folder Anda, kemudian hanya rm atau rmdir semua folder untuk membersihkannya. Jalankan FSCK secara manual untuk menghapus data yang tersisa saat dibutuhkan. Agak malas tidak menuliskannya maaf :).

Adam Lazo
sumber
0

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 sejumlah file yang Anda perlu bersihkan secara teratur adalah dengan meletakkan direktori pada sistem file sendiri ( misal , partisi). Kemudian ketika Anda perlu membersihkannya, unmount, jalankan mkfs, dan remount. Sebagai contoh, OpenBSD menyarankan untuk melakukan hal ini/usr/obj , di mana banyak file dibuat selama pembangunan sistem, dan harus dihapus sebelum pembangunan berikutnya.

fkraiem
sumber