Saya memiliki direktori dengan beberapa ratus ribu file di dalamnya.
Saya ingin menghapus semua file, tetapi laporan rm * -f: "daftar argumen terlalu panjang"
Apa cara terbaik untuk menghapus direktori ini?
Saya memiliki direktori dengan beberapa ratus ribu file di dalamnya.
Saya ingin menghapus semua file, tetapi laporan rm * -f: "daftar argumen terlalu panjang"
Apa cara terbaik untuk menghapus direktori ini?
Jawaban:
Jika Anda tidak dapat menghapus direktori, Anda selalu dapat menggunakan find.
find . -maxdepth 1 -type f -exec rm -f {} \;
Itu akan menghapus semua file di direktori saat ini, dan hanya direktori saat ini (bukan subdirektori).
find dir/to/delete -delete
(Tidak menelurkan rm
proses per file untuk dihapus).
find dir/to/delete -type f -delete
Temukan . -maxdepth 1 -type f -exec rm -f {} \;
itu hanya memakan waktu terlalu lama (satu eksekutif rm per file).
ini jauh lebih efisien:
Temukan . -maxdepth 1 -type f -print0 | xargs -r0 rm -f
karena dibutuhkan sebanyak nama file sebagai argumen untuk rm sebanyak mungkin, kemudian jalankan rm dengan pemuatan nama file berikutnya ... mungkin saja rm hanya dipanggil 2 atau 3 kali.
ionice
sesaat sebelumnya rm
adalah ide yang bagus jika komputer digunakan oleh orang lain secara bersamaan.
Kedua hal ini akan menyelesaikan masalah. Ada analisis kinerja masing-masing teknik masing-masing di sini .
find . -name WHATEVER -exec rm -rf {} \;
atau
ls WHATEVER | xargs rm -rf
Masalahnya berasal dari perluasan bash "*" dengan item everysingle di direktori. Kedua solusi ini bekerja melalui masing-masing file sebagai gantinya.
find . -print0 | xargs -0 rm
).
ls *
", dan " *
" memperluas ke daftar argumen yang mengeluh bahwa shell Anda terlalu panjang. Lakukan " ls .
" sebagai gantinya (atau naik satu tingkat direktori dan lakukan " ls [dirname]
").
Saya dapat melakukan ini dengan mencadangkan satu tingkat:
cd ..
Dan berlari:
rm directory name -rf
Dan kemudian menciptakan kembali direktori.
Semua ini menemukan doa yang sangat bagus tetapi saya jarang ingat persis nomenklatur yang dibutuhkan ketika saya sedang terburu-buru: sebaliknya saya menggunakan ls. Sebagai seseorang menyebutkan, ls. akan bekerja tetapi saya lebih suka ls -1 seperti pada:
ls -1 | xargs -n 100 rm -rf
Sosok -n xxx cukup aman untuk dimainkan karena melebihi maksimum akan dikoreksi otomatis (jika ukuran-max terlampaui; lihat -s) atau jika args-max untuk suatu aplikasi terlampaui, biasanya akan lebih baik jelas.
Perlu dicatat grep berguna untuk menyisipkan di tengah rantai ini ketika Anda hanya ingin menghapus subset file dalam direktori besar, dan tidak dengan alasan apa pun ingin menggunakan find.
Jawaban ini mengasumsikan Anda menggunakan utilitas inti Gnu untuk ls, xargs, dll.
Berikut adalah versi untuk menghapus sejumlah besar file ketika sistem perlu tetap responsif.
Ini bekerja dengan mengeluarkan pekerjaan dalam batch kecil (100 file secara default) dan menunggu sedikit untuk pekerjaan lain selesai.
Bekerja dengan sangat baik untuk menghapus lebih dari setengah juta file dari direktori tunggal pada ext3. Ini mencetak persentase yang dilakukan sebagai bonus kecil
noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
n=$((n+100));
sync;
echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
sleep 5;
done
Memecahkan kesalahan "argumen terlalu lama" atau "tidak dapat mengalokasikan memori"
Ini berhasil pada 220.000+ file di folder sesi ....
Keuntungan: langsung mulai menghapus file
jalur cd / ke / folder
ls -f | xargs rm -f -v
KLIK untuk tangkapan layar file yang dihapus - (dihapus semua file dalam ~ 15 menit)
-f (setelah ls) mencegah presorting
-v (setelah rm) menampilkan setiap file yang sedang dihapus
-f (setelah rm) memaksa tanpa prompt pada file yang dilindungi tulis
Kiat: Ganti nama folder (ex session ke session_old) terlebih dahulu untuk menjaga agar file autogenerasi tambahan tidak ditambahkan saat Anda mencoba menghapus file. Anda dapat membuat ulang direktori asli secara manual jika tidak secara otomatis seperti dalam kasus saya