Bagaimana saya bisa menghapus folder dengan banyak subfolder dengan cepat?

15

Saya memiliki folder dengan subfolder 266778. Bagaimana saya bisa menghapusnya?

saya telah mencoba

cd ~/.local/share/Trash/
sudo rm -rf *

tetapi butuh banyak waktu. Setelah 1 menit 25 detik waktu nyata dan waktu pengguna 0,072 detik hanya dihapus 2500 folder. Dengan cara ini, akan diperlukan lebih dari dua jam untuk menghapus folder ini.

Apakah ada cara yang lebih cepat untuk menghapus folder ini? Mengapa ada perbedaan besar antara waktu pengguna dan waktu nyata?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Saya menggunakan Linux 2.6.32 (Ubuntu 10.04.4 LTS).

Martin Thoma
sumber
Saya baru saja googled masalah ini dan tampaknya beberapa orang telah menemukan bahwa rsync dapat digunakan sebagai alat "banyak file-penghapusan" cukup efisien. Apakah itu benar-benar lebih cepat tetap terserah Anda untuk mengevaluasi.
Johan
2
Untuk apa nilainya: kinerja ketika menghapus banyak folder / file sangat tergantung pada sistem file. Dalam pengalaman saya perbedaan ketika menghapus jutaan file kecil di ext3 (lambat) vs XFS (cepat) bisa berjam-jam.
pdo
Jika Anda sering memiliki kasing ini dan dapat merencanakan ke depan, menggunakan sistem file seperti btrfs dan menggunakan subvolume, Anda dapat mempercepat dengan cepat hanya dengan membuang subvolume itu.
PlasmaHH
Di sinilah Anda dapat menemukan jawabannya. Perl satu adalah yang tercepat. unix.stackexchange.com/questions/37329/…
SDsolar

Jawaban:

17

Jika versi "find" Anda mengimplementasikan sub-perintah -delete, maka Anda dapat mencoba

find directory -delete

Pada kasus ini:

find ~/.local/share/Trash/ -delete

Beberapa perintah, seperti rm, melakukan sebagian besar pekerjaan mereka di kernel. Dalam rutinitas sistem file, tepatnya. Waktu yang dihabiskan untuk melakukan panggilan sistem dihitung dengan cara itu, jadi sementara perintah "rm" Anda berjalan untuk waktu yang lama, itu tidak melakukan banyak pekerjaan di tanah pengguna - panggilan sistem melakukan sebagian besar pekerjaan.

Johan
sumber
+1; meskipun ini juga menghapus dir induk dan saya menduga OP hanya ingin menghapus isi folder Sampah bukan folder itu sendiri
don_crissti
1
@don_crissti: ucapan yang baik. jika OP hanya ingin menghapus subdir di bawah ~ / .local / share / Trash (dan bukan file di level 1), maka: find ~/.local/share/Trash/*/ -delete (tentu saja, ini juga akan menghapus file (dan dir) di salah satu dari Trash / * / subdirs juga)
Olivier Dulac
2
+1 untuk menjelaskan perilaku anehtime
Martin Thoma
3
Benarkah find directory -deletelebih cepat dari itu rm -rf directory? Lagi pula, mereka melakukan pekerjaan yang sama, dan tidak ada dua cara untuk melakukannya.
Gilles 'SO- berhenti bersikap jahat'
1
@ Johan temukan sangat cepat. Apakah Anda pernah mendapat kesempatan untuk mencari tahu alasannya?
Harshdeep
20

Itu tergantung pada definisi Anda tentang puasa . Jawaban yang sudah ada di sini memberikan solusi yang baik untuk benar-benar menghapus direktori dari sistem file, tetapi jika Anda benar-benar perlu untuk membebaskan nama direktori secepat mungkin, mengganti nama pada sistem file yang sama adalah instan:

{ mv directory directory.gone && rm -rf directory.gone; } &

Secara teknis ini curang karena saya belum mempercepat penghapusan yang sebenarnya, tetapi secara praktis ini sangat berguna: Saya menggunakan trik ini sepanjang waktu sehingga saya tidak harus menunggu operasi penghapusan yang lambat.

kojiro
sumber
Bagus. Apa kasus penggunaan Anda untuk melakukan ini sepanjang waktu? Jika Anda sering melakukannya, bukankah ada bahaya Anda akan menumpuk, dapatkan beberapa direktori. Lakukan dan gagal? Saya kira Anda menggunakan akhiran seperti '$$' atau '% (tanggal ...)'
smci
1
Jika saya membutuhkannya, saya mungkin bisa menggunakan mktemp dengan argumen yang memastikannya tetap pada sistem file yang sama. Tetapi saya tidak dapat mengatakan saya memiliki contoh spesifik saat ini.
kojiro
kojiro ya terima kasih, mktempadalah apa yang saya coba ingat ...
smci
1

rm -rf directoryatau rm -rf *tentu saja adalah metode tercepat kecuali rmimplementasi lokal Anda rusak.

Menggunakan findtidak memberi keuntungan.

Apakah ini cepat atau lambat terutama tergantung pada sistem file dan implementasi OS. Jadi pertanyaannya sepertinya tidak tepat.

UFS dan ZFS pada Solaris dikenal sangat cepat dengan tugas seperti ini karena kedua implementasi sistem file termasuk kode penghapusan latar belakang yang tertunda yang menyebabkan unlink()dan rmdir()panggilan untuk kembali dengan cepat bahkan ketika objek terkait akan membutuhkan lebih banyak waktu secara total.

Dengan latar belakang yang tertunda dihapus di kernel, pembaruan direktori dapat dilakukan dengan cepat juga dan ini membantu mempercepat seluruh operasi.

schily
sumber
Walaupun seseorang dapat dimaafkan karena berpikir demikian, ini sebenarnya tidak benar, seperti yang dijelaskan oleh jawaban ini .
Hitechcomputergeek
0

Ini hanya sebagian jawaban, menyoroti tiga nilai yang dikembalikan oleh perintah; dikutip dari halaman time(1)manual :

(i) waktu sebenarnya yang telah berlalu antara pemanggilan dan penghentian, (ii) waktu CPU pengguna (jumlah tms_utimedan tms_cutimenilai - nilai dalam a yang struct tmsdikembalikan olehtimes(2) ), dan (iii) waktu CPU sistem (jumlah tms_stimedan tms_cstimenilai - nilai dalam struct tmsdikembalikan oleh times(2)). "

schaiba
sumber