Hapus file yang lebih lama dari X hari +

143

Saya telah menemukan perintah untuk menghapus file yang lebih lama dari 5 hari di folder

find /path/to/files* -mtime +5 -exec rm {} \;

Tetapi bagaimana saya juga melakukan ini untuk subdirektori dalam folder itu?

Teddy291
sumber
Apakah maksud Anda file di dalam sub direktori? atau sub direktori itu sendiri?
rahul
3
find /path/to -type d -empty -delete
Costas
2
Hapus file dalam subdirektori yang juga berumur 5+ hari
Teddy291
3
Mungkin menyenangkan ketika saya memiliki file dengan spasi. Misalnya file yang disebut "test one" dan rm mendapat makan rm test one. (Yang akan menghapus file yang disebut "test" dan file yang disebut "one", tetapi bukan file yang disebut "test one"). Petunjuk: -delete atau -print0
Hennes
6
Sebagai catatan tambahan, selalu kutip argumen yang diberikan olehfind untuk menghindari masalah dengan karakter khusus, seperti yang disebutkan dalam baris pertama jawaban. Misalnya:find /path/to/files/ -exec somecommand '{}' \;
Walf

Jawaban:

240

Berhati-hatilah dengan nama file khusus (spasi, tanda kutip) saat mengirim pip ke rm.

Ada alternatif yang aman - opsi -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Itu saja, tidak ada panggilan rm terpisah dan Anda tidak perlu khawatir tentang nama file.

Ganti -deletedengan -depth -printuntuk menguji perintah ini sebelum Anda menjalankannya ( -deletetersirat -depth).

basic6
sumber
23
Juga gunakan -type funtuk menghapus file saja (dan menyimpan sub direktori)
Oleg
3
Atau, jika Anda ingin melakukan hal yang sama untuk semua file BARU dari lima hari: temukan / path / ke / direktori / -langkah ke-1 -mtime -5 -delete
zmonteca
Jika jalur saya berisi spasi, bagaimana cara melakukannya? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio
3
@ uom-pgregorio Saya akan menyarankan untuk meletakkan path dalam tanda kutip.
Atrip
4
Perhatikan bahwa setiap findargumen adalah filter yang menggunakan hasil dari filter sebelumnya sebagai input. Jadi pastikan Anda menambahkan -delete sebagai argumen terakhir. IE: find . -delete -mtime +5akan menghapus SEMUA yang ada di jalur saat ini.
Johan
15

Perhatikan bahwa perintah ini tidak akan berfungsi ketika menemukan terlalu banyak file. Ini akan menghasilkan kesalahan seperti:

bash: /usr/bin/find: Argument list too long

Berarti batas panggilan sistem eksekutif pada panjang baris perintah terlampaui. Alih-alih menjalankan rm dengan cara itu, jauh lebih efisien untuk menggunakan xargs . Berikut ini contoh yang berfungsi:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Ini akan menghapus semua file (tipe f) yang dimodifikasi lebih dari 14 hari yang lalu di bawah / root / Maildir / secara rekursif dari sana dan lebih dalam (mindepth 1). Lihat manual temukan untuk opsi lainnya .

Julius
sumber
7
Per @ AfshinHamedi menjawab pada AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), berhati-hatilah dengan file yang berisi baris baru dan karakter khusus. Alih-alih menggunakanfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe
2
Atau cukup tambahkan '+' ke hasil pencarian
Dani_l
8

Itu sama. Anda hanya perlu memberikan direktori induk daripada awalan file. Dalam contoh Anda, itu akan menjadi:

find /path/to -type f -mtime +5 -exec rm {} \;

Ini akan menghapus semua file yang lebih lama dari 5 hari yang berada di bawah /path/todan sub-direktori.

Untuk menghapus sub-direktori kosong, lihat komentar @Costas di atas.

apaul
sumber
4
Perhatikan bahwa untuk setiap file Anda akan menjalankan perintah rm. Jika Anda memiliki 1000 file yang lebih lama dari 5 hari maka rm akan memulai 1000 kali. Karena alasan ini pertimbangkan opsi -delete seperti dalam komentar Costa atau -exec rm {} \ +
Hennes
@ Hennes: - 1) tidak yakin Anda perlu melarikan diri +dalam kasus itu. - 2) lebih baik menulis -exec rm '{}' +untuk menangkis kejahatan file dengan karakter khusus (spasi, baris baru, dll ...) atas nama mereka.
Cbhihe
-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Susil
sumber