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)?
Anda dapat mencoba memutuskan tautan inode untuk direktori tetapi itu akan memberi Anda banyak file yatim yang fsckakan 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.
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.
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. ;-)
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 :).
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.
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
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 argumenrm
. Makarm
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 berjalanrm
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 menggunakanunlink
panggilan internal ke kernel (sepertirm
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.sumber
unlink
panggilan sistem pada direktori (Anda akan mendapatkanEISDIR
kesalahan), sehingga opsi pertama tidak memungkinkan.mv
ing antara filesystem / partisi yang berbeda berarticp
diikuti oleh arm
./tmp
berada pada sistem file yang sama, saya bertanya-tanya apakahmv
dan restart akan lebih cepat? Saya tidak yakin apakah/tmp
sudah dibersihkan dengan menggunakanrm
.rsync
dalam hal patokan ini lebih cepat darirm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…Terkadang,
find $DIR_TO_DELETE -type f -delete
lebih cepat darirm -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 kembalimount
.sumber
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:
Catatan:
Pembaruan: Saya menemukan trik rapi untuk menjalankan banyak rm secara paralel - ini akan membantu jika Anda memiliki array disk yang besar:
-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
sumber
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. The-depth
pilihan memberitahufind
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 :).
sumber
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.sumber