Bagaimana saya bisa menghapus semua file dari direktori ketika melaporkan "Daftar argumen terlalu panjang"


Jawaban:


11

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).


hampir sempurna (lihat posting saya juga)
asdmin

2
Di linux Anda bisa melakukannya lebih cepat dengan menggunakan "+" daripada "\;". Itu akan menyebabkannya menghapus lebih banyak file per "rm" dalam sekali jalan.
Thomas

5
Bahkan lebih cepat: find dir/to/delete -delete(Tidak menelurkan rmproses per file untuk dihapus).
Morten Siebuhr

Morten: Dia tidak pernah menyebutkan ingin menghapus direktori itu sendiri, eh kata onky file. find dir/to/delete -type f -delete
richo

21
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.


5
Senang melihat seseorang tahu cara menemukan bekerja ... Juga pertimbangkan dengan gnu find's -delete action atau -exec command {} + yang bertindak seperti xargs. Lihat bagian Tindakan 'man find'.
Kyle Brandt

Saya tidak tahu tentang -exec cmd {} +. Itu terlihat agak berguna. Sedikit lebih generik dari -delete :)
David Pashley

-delete mungkin baik-baik saja, tapi saya pribadi lebih suka perintah yang dapat digunakan pada berbagai mesin. Solaris sistem saya bekerja dengan lebih tua, jadi -delete tidak akan bekerja pada mereka
asdmin

2
Menambahkan ionicesesaat sebelumnya rmadalah ide yang bagus jika komputer digunakan oleh orang lain secara bersamaan.
Hubert Kario

6

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.


2
Solusi find lebih lambat dengan banyak file karena memanggil perintah rm untuk setiap file. Solusi xargs lebih cepat tetapi hanya berfungsi ketika nama file tidak mengandung spasi (jika tidak Anda perlu mencari GNU dan find . -print0 | xargs -0 rm).
Robcast

"find. -name WHATEVER -print0 | xargs -0 rm -rf" akan lebih efisien. find akan melakukan form suatu rm untuk setiap file, di mana xargs akan menguranginya seminimal mungkin. Anda memerlukan -print0 dan -0 untuk mengatasi file dengan spasi. Anda mungkin juga ingin menggunakan -depth on find, jadi pencarian pertama yang mendalam.
David Pashley

Perintah ls tidak akan berfungsi, karena itu juga mengembalikan "daftar argumen terlalu lama"
Brent

2
Anda sedang melakukan " 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]").
James Sneeringer

baris perintah kedua (ls APA PUN | xargs rm-rf) tidak akan bekerja untuk alasan yang sama seperti pertanyaan tidak bekerja: APA PUN akan substituded oleh shell ke panjang melebihi
asdmin

3

Saya dapat melakukan ini dengan mencadangkan satu tingkat:

cd ..

Dan berlari:

rm directory name -rf

Dan kemudian menciptakan kembali direktori.


1
ini hanya berfungsi jika Anda tidak harus memiliki dir secara permanen dan semua file dan direktori akan dihapus secara rekursif. sebagian besar kasus dalam hidup saya, cara ini tidak akan berhasil.
asdmin

2

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.


Apakah ini akan berfungsi dengan direktori yang terlalu besar untuk "ls" untuk berfungsi? (kesalahan yang sama - daftar argumen terlalu lama)
Brent

Ya Brent: pastikan untuk tidak menggunakan filespec saat memanggil ls. Gunakan -1 (dash One) seperti yang ditunjukkan di atas. Dan seperti yang dijelaskan di atas, gunakan grep setelah ls jika Anda perlu memasangkan daftar file. Jika Anda mendapatkan kesalahan "terlalu lama" setelah memastikan Anda tidak menggunakan wildcard dengan ls, maka mungkin xargs mengeluh. Gunakan 'xargs -n 5' alih-alih 'xargs -n 100' dan Anda harus aman, jika sedikit lebih lambat.
rixtertech

1

Anda dapat menggunakan -exec +opsi untuk menemukan mana yang akan mencoba menjalankan rm sesering mungkin, yang mungkin lebih cepat.

find . -type f -exec rm '{}' +

0

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

0

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


Apa yang baru dalam jawaban Anda yang hilang dari yang sebelumnya?
user2233709
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.