Saya memiliki dir yang diisi dengan jutaan gambar gif. Terlalu banyak untuk perintah rm.
Saya telah mencoba perintah find seperti ini:
find . -name "*.gif" -print0 | xargs -0 rm
Masalahnya, mesin saya rusak parah, dan menyebabkan waktu habis bagi pelanggan karena itu server.
Apakah ada cara yang lebih cepat untuk menghapus semua file ini ... tanpa mengunci mesin?
rm -rf
akan lebih cepat. Ini patut dicoba.Jawaban:
Lebih cepat belum tentu apa yang Anda inginkan. Anda mungkin ingin benar-benar berjalan lebih lambat , sehingga penghapusan mengunyah lebih sedikit sumber daya saat sedang berjalan.
Gunakan nice (1) untuk menurunkan prioritas perintah.
Untuk proses I / O-terikat bagus (1) mungkin tidak cukup. Penjadwal Linux memang memperhitungkan I / O, bukan hanya CPU, tetapi Anda mungkin ingin kontrol yang lebih baik atas prioritas I / O.
Jika itu tidak berhasil, Anda juga bisa menambahkan tidur untuk memperlambatnya.
sumber
sleep
tambahan - Saya mengalami masalah dengan server yang tersedak IO meskipun menggunakanionice -c 3
. Itu menambah secara signifikan waktu yang diperlukan untuk menghapus file (tentu saja), tapi saya lebih suka menunggu daripada membawa aplikasi ke bawah ...Karena Anda menjalankan Linux dan tugas ini mungkin terikat I / O, saya menyarankan untuk memberikan prioritas penjadwal I / O perintah Anda menggunakan
ionice(1)
:Dibandingkan dengan perintah awal Anda, saya kira ini bahkan dapat meluangkan lebih banyak siklus CPU dengan menghindari pipa
xargs
.sumber
find ... -exec
tempat yang masuk akal.find(1)
dokumentasi mengklaim demikian. :) Dan harus jelas bahwa membiarkanfind
dirinya sendiri menghapus file lebih efisien daripada memintarm
perintah untuk ini.ionice -c3
menurunkan prio untuk hanya berjalan ketika IO idle sebaliknya jadi ini sempurna. Perhatikan bahwa karena-delete
ini bukan standar untuk find, Anda dapat melakukan hal yang sama (termasuk umpan balik yang berfungsi) menggunakan perintah ini:ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
- Pelan tapi tidak ada proses informasi penting.Tidak.
Tidak ada cara yang lebih cepat, mulai dari format lunak disk. File diberikan ke rm sekaligus (hingga batas baris perintah, bisa juga diatur ke
xargs
) yang jauh lebih baik daripada memanggil rm pada setiap file. Jadi tidak, pasti tidak ada cara yang lebih cepat.Menggunakan
nice
(ataurenice
pada proses yang berjalan) hanya membantu sebagian, karena itu adalah untuk menjadwalkan sumber daya CPU , bukan disk! Dan penggunaan CPU akan sangat rendah. Ini adalah kelemahan linux - jika satu proses "menggerogoti" disk (yaitu banyak bekerja dengan itu), seluruh mesin macet. Kernel yang dimodifikasi untuk penggunaan waktu nyata bisa menjadi solusi.Apa yang akan saya lakukan di server adalah membiarkan proses lain melakukan pekerjaannya secara manual - sertakan jeda untuk menjaga server "bernafas":
Ini akan menunggu 5 detik setelah setiap 100 file. Ini akan memakan waktu lebih lama tetapi pelanggan Anda seharusnya tidak melihat adanya keterlambatan.
sumber
rm *
, ia mengembang*
ke baris dengan semua nama file dan meneruskannya kerm
? Itu sangat bodoh. Mengapa shell perluas wildcard?*
atau/*
dan memberikan keraguan terhadap keputusan pengguna tersebut.Jika jumlah file yang akan dihapus jauh melebihi jumlah file yang tertinggal, itu mungkin bukan pendekatan yang paling efisien untuk berjalan di pohon file yang akan dihapus dan melakukan semua pembaruan sistem file tersebut. (Ini analog dengan melakukan manajemen memori kalkulasi-referensi yang kikuk, mengunjungi setiap objek di pohon besar untuk menjatuhkan referensi, alih-alih membuat segala sesuatu yang tidak diinginkan menjadi sampah dalam satu langkah, dan kemudian menyapu apa yang dapat dibersihkan dengan mudah.)
Artinya, mengkloning bagian-bagian pohon yang harus disimpan ke volume lain. Buat kembali sistem file yang baru dan kosong pada volume asli. Salin file yang disimpan kembali ke jalur aslinya. Ini agak mirip dengan menyalin pengumpulan sampah .
Akan ada beberapa downtime, tetapi bisa lebih baik daripada kinerja buruk dan gangguan layanan terus menerus.
Mungkin tidak praktis dalam sistem dan situasi Anda, tetapi mudah untuk membayangkan kasus-kasus nyata di mana ini adalah jalan yang harus ditempuh.
Sebagai contoh, misalkan Anda ingin menghapus semua file dalam sistem file. Apa gunanya mengulang dan menghapus satu per satu? Lepas saja dan lakukan "mkfs" di atas partisi untuk membuat sistem file kosong.
Atau misalkan Anda ingin menghapus semua file kecuali setengah lusin file penting? Dapatkan setengah lusin keluar dari sana dan ... "mkfs" di atas.
Akhirnya ada beberapa titik impas ketika ada cukup file yang harus tetap, sehingga menjadi lebih murah untuk melakukan penghapusan rekursif, dengan mempertimbangkan biaya lain seperti downtime.
sumber
Sudahkah Anda mencoba:
Tanda + di bagian akhir akan menyebabkan find menyertakan lebih banyak file untuk perintah rm tunggal yang akan dieksekusi. Periksa pertanyaan ini untuk lebih jelasnya.
sumber
-delete
) yang tidak selalu harus ada di sana ..