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)?
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)?
Jawaban:
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
rm
akan 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 rm
harus 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 rm
sekali per file yang ditemukannya. Sangat lambat. Temukan argumen perintah perintah build gaya xargs -exec rm {} +
tapi itu sama lambatnya dengan ekspansi. Anda dapat memanggil -delete
yang menggunakan unlink
panggilan internal ke kernel (seperti rm
halnya) tetapi itu hanya akan berfungsi untuk file pada awalnya.
Jadi ulangi, kecuali Anda membuang disk ke dalam cairan magma panas, rm
adalah 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.
unlink
panggilan sistem pada direktori (Anda akan mendapatkan EISDIR
kesalahan), sehingga opsi pertama tidak memungkinkan.
mv
ing antara filesystem / partisi yang berbeda berarti cp
diikuti oleh a rm
.
/tmp
berada pada sistem file yang sama, saya bertanya-tanya apakah mv
dan restart akan lebih cepat? Saya tidak yakin apakah /tmp
sudah dibersihkan dengan menggunakan rm
.
rsync
dalam hal patokan ini lebih cepat dari rm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…
Terkadang, find $DIR_TO_DELETE -type f -delete
lebih 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
, mkfs
dan kembali mount
.
type -f
untuk menunjukkan file dan bukan direktori? juga, menambahkan -print
menunjukkan file saat mereka sedang dihapus.
Jika Anda tidak membutuhkan ruang kosong, cara tercepat adalah menunda penghapusan dan melakukannya di latar belakang:
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:
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
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. The -depth
pilihan memberitahu find
ke daftar anak pertama.
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 :).
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.