Bagaimana cara menghapus semua file yang lebih lama dari 3 hari ketika "Daftar argumen terlalu panjang"?

89

Saya punya direktori file log yang memiliki 82000 file dan direktori di dalamnya (sekitar setengah dan setengah).

Saya perlu menghapus semua file dan direktori yang lebih lama dari 3 hari.

Di direktori yang memiliki 37000 file di dalamnya, saya dapat melakukan ini dengan:

find * -mtime +3 -exec rm {} \;

Tetapi dengan 82000 file / direktori, saya mendapatkan error:

/ usr / bin / find: Daftar argumen terlalu panjang

Bagaimana cara mengatasi kesalahan ini sehingga saya dapat menghapus semua file / direktori yang lebih lama dari 3 hari?

Edward Tanguay
sumber
1
Apakah Anda mencoba find -mtime +3 -exec rm {} +?
Gilles Quenot
1
Saya percaya berlari find * -mtime +3 |xargs rmakan menyelesaikan masalah itu.
Mats Petersson
9
Saya pikir satu-satunya masalah adalah find *. find .lebih baik. Shell globing dengan memperluas *ke daftar file dan direktori yang sangat besar.
kebisingan tanpa seni
@artlessnoise tepat.
sjas

Jawaban:

120

Untuk menghapus semua file dan direktori dalam direktori saat ini :

find . -mtime +3 | xargs rm -Rf

Atau sebagai alternatif, lebih sesuai dengan perintah asli OP:

find . -mtime +3 -exec rm -Rf -- {} \;
hd1
sumber
26
-1 Masalahnya adalah bintang di "temukan *", Anda menyelesaikannya dengan menggunakan "temukan." sebagai gantinya. Xargs menyesatkan di sini.
Aleksandr Levchuk
7
@AleksandrLevchuk itu memecahkan masalah OP, dan karena itu tidak pantas mendapat downvote
hd1
11
Pertanyaan: "temukan * -mtime +3 -exec rm {} \;" memberikan daftar Argumen terlalu panjang. Jawaban: Gunakan "find. -Mtime +3 -exec rm {} \;"
Aleksandr Levchuk
2
Anda mungkin ingin menambahkan --setelah rm, sepertifind . -mtime +3 -exec rm -- {} \;
domen
8
Tidak ada yang mengatakan untuk apa --.
Acumenus
59

Bisa juga menggunakan:

find . -mindepth 1 -mtime +3 -delete

Untuk tidak menghapus direktori target

vangheem
sumber
4
Jawaban terbaik, jauh lebih bersih daripada menelepon rm (dan mungkin lebih aman). Berfungsi untuk subdirektori juga.
basic6
16

Solusi lain untuk pertanyaan awal, esp. berguna jika Anda hanya ingin menghapus BEBERAPA file lama dalam sebuah folder, akan seperti ini:

find . -name "*.sess" -mtime +100 

dan seterusnya .. Quotes block shell wildcard, sehingga memungkinkan Anda untuk "menemukan" jutaan file :)

62mkv
sumber