Hapus file yang lebih lama dari 7 hari secara otomatis

17

Saya seorang noob yang lengkap di linux tetapi saya mulai mengerti. Saya memiliki Ubuntu Server 16.04 yang menjalankan server FTP untuk membuat cadangan file video keamanan. File-file akan disimpan dalam folder seperti: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3dan sebagainya.

Perhatikan bahwa masing-masing securityfolderNadalah pengguna yang berbeda.

Karena saya tidak ingin hard drive saya penuh sepanjang waktu, saya ingin menghapus file yang lebih lama dari 7 hari di folder ini setiap hari.

Jacco van de Wijgaart
sumber
/homebiasanya berisi subfolder untuk setiap pengguna. Jika Anda tidak ingin menyimpan cadangan Anda sebagai pengguna yang berbeda (bukan ide yang sangat bagus), Anda harus mempertimbangkan lokasi lain, misalnya /home/security/backup1dan seterusnya.
Melebius
@Melebius terima kasih atas komentar Anda, setiap / securityfolder adalah pengguna yang berbeda, saya lupa menyebutkannya.
Jacco van de Wijgaart

Jawaban:

27

Pertama, perintah ini akan menemukan dan menghapus semua file yang lebih lama dari 7 hari di subdirektori mana pun /homeyang namanya dimulai dengan securityuser:

find /home/securityuser* -mtime +6 -type f -delete

Anda perlu -mtime +6dan bukan +7karena -mtimemenghitung periode 24jam. Seperti yang dijelaskan di -atimebagian man find( -mtimebekerja dengan cara yang sama):

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

Jadi, untuk menemukan file yang diubah 7 hari atau lebih yang lalu, Anda perlu menemukan file yang dimodifikasi lebih dari 6 hari yang lalu -mtime +6.

Langkah selanjutnya adalah menjalankan perintah ini sekali sehari. Karena masing securityuserN- masing adalah pengguna yang berbeda (Anda mungkin ingin memikirkan kembali pengaturan itu, itu membuat semuanya lebih rumit), ini harus dijalankan sebagai root. Jadi, edit /etc/crontab:

sudo nano /etc/crontab

Dan tambahkan baris ini:

@daily root find /home/securityuser* -mtime +6 -type f -delete

Itu akan menjalankan findperintah sekali sehari dan menghapus file.

terdon
sumber
+1 Menggerakkan kuku sedikit lebih dalam dan mungkin mengulangi saran Melebius kepada OP, bahwa find '/home/securityuser/*' -mtime +6 -type f -delete(dengan semua perubahan yang terkait dan sesuai dalam pembuatan pengguna) umumnya merupakan ide yang lebih baik daripada find '/home/securityuser*' -mtime +6 -type f -delete(tanpa garis miring) ...?
Cbhihe
@ Cbhihe tidak, direktori target dipanggil /home/securityuserN, jadi tanpa slash, mereka tidak akan ditemukan.
terdon
yup, lihat itu; hanya tidak menganggap itu praktik yang baik dari pihak OP (membuat pengguna terpisah untuk setiap video keamanan, dll ...) di sepanjang baris komentar pertama Melebius, meskipun OP mungkin memiliki alasan untuk melakukannya. Jika ada komentar saya lemah, bukan kritik atas jawaban yang baik dan lengkap.
Cbhihe
1
+1 Dari saya. Catat satu detail saat saya menjalankan ini di RHEL: wildcard tidak berfungsi di jalan. Saya harus meletakkannya di -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis
1
@SteliosAdamantidis oh wow, saya benar-benar merindukan itu! Ya, versi aslinya tidak akan berfungsi sejak saya kutip 'securityuser*'. Wildcard harus diperluas oleh shell, bukan oleh find, jadi seharusnya securityuser*(tanpa tanda kutip). Lihat jawaban yang diperbarui. Terima kasih telah menunjukkannya, Stelio, aku tidak percaya tidak ada yang memperhatikan sebelumnya! Vlakas Ti!
terdon
4

sesuai pengetahuan saya:

coba findperintah seperti ini:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm
Maulik Patel
sumber
Terima kasih atas jawaban Anda. Apakah ./dirc/* berarti: ./home/securityfolder1/* atau ini salah?
Jacco van de Wijgaart
Saya baru saja mencobanya di virtualbox saya find /home/jacco/ -mtime +1 -type f -deletedan sepertinya berhasil. Bagaimana saya mengotomatisasi ini?
Jacco van de Wijgaart
buat satu file skrip dan jalankan perintah ini menggunakan skrip jika itu berfungsi daripada menjalankan file skrip Anda pada proses startup.
Maulik Patel
saya seperti supernoob di sini karena bagian dari pembuatan skrip, apakah ini berarti file dengan #!/bin/bashdan kode di bawahnya? atau apakah saya benar-benar bodoh di sini?
Jacco van de Wijgaart
2
@Melebius tidak, jalur itu tidak boleh dikutip, terutama ketika berisi karakter glob. Anda ingin diperluas oleh shell dan kutipan akan memblokirnya. Coba, misalnya: find '/u*' -name local. Arahan seperti -name "foo*"itu harus dikutip ketika mengandung karakter glob.
terdon