Elimina automaticamente i file più vecchi di 7 giorni


17

Sono un noob completo su Linux, ma sto cominciando a capire. Ho un Ubuntu Server 16.04 che esegue un server FTP per il backup dei file video di sicurezza. I file verranno memorizzati in cartelle come: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3e così via.

Si noti che ognuno securityfolderNè un utente diverso.

Poiché non desidero che i miei dischi rigidi siano sempre pieni, desidero eliminare quotidianamente i file più vecchi di 7 giorni in queste cartelle.


/homedi solito contiene una sottocartella per ciascun utente. Se non si desidera archiviare i backup come utenti diversi (non è una buona idea), è necessario prendere in considerazione un'altra posizione, ad esempio /home/security/backup1e così via.
Melebio

@Melebius grazie per il tuo commento, ogni / securityfolder è un utente diverso, ho dimenticato di menzionarlo.
Jacco van de Wijgaart,

Risposte:


27

Innanzitutto, questo comando troverà ed eliminerà tutti i file più vecchi di 7 giorni in qualsiasi sottodirectory il /homecui nome inizia con securityuser:

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

È necessario -mtime +6e non +7perché -mtimeconta periodi di 24 ore. Come spiegato nella -atimesezione di man find( -mtimefunziona allo stesso modo):

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

Quindi, per trovare un file che è stato modificato 7 o più giorni fa, è necessario trovare i file che sono stati modificati più di 6 giorni fa, quindi -mtime +6.

Il prossimo passo è far eseguire questo comando una volta al giorno. Dato che ognuno securityuserNè un utente diverso (potresti voler ripensare quella configurazione, rende tutto più complicato), questo deve essere eseguito come root. Quindi, modifica /etc/crontab:

sudo nano /etc/crontab

E aggiungi questa riga:

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

Ciò eseguirà il findcomando una volta al giorno ed eliminerà i file.


+1 Spingendo l'unghia un po 'più a fondo e forse ribadendo il suggerimento di Melebius a OP, che find '/home/securityuser/*' -mtime +6 -type f -delete(con tutti i cambiamenti pertinenti e appropriati nella creazione dell'utente) potrebbe generalmente essere un'idea migliore di find '/home/securityuser*' -mtime +6 -type f -delete(nessuna barra nel percorso) ...?
Cbhihe,

@Cbhihe no, vengono chiamate le directory di destinazione /home/securityuserN, quindi senza la barra non verranno trovate.
terdon,

sì, l'ho visto; semplicemente non pensavo che fosse una buona pratica da parte di OP (creare un utente separato per ogni video di sicurezza, ecc ...) sulla falsariga del primo commento di Melebius, anche se OP potrebbe avere le sue ragioni per farlo. Semmai il mio commento è stato scadente, non una critica alla tua buona e completa risposta.
Cbhihe,

1
+1 Da parte mia. Basta notare un dettaglio mentre lo eseguivo su RHEL: il carattere jolly non ha funzionato sul percorso. Ho dovuto metterlo sul -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis il

1
@SteliosAdamantidis oh wow, mi sono completamente perso! Sì, la versione originale non funzionava da quando avevo citato 'securityuser*'. Il carattere jolly dovrebbe essere espanso dalla shell, non da find, quindi dovrebbe essere stato securityuser*(senza virgolette). Vedi la risposta aggiornata. Grazie per averlo sottolineato, Stelio, non riesco a credere che nessuno l'abbia notato prima! Ti vlakas!
Terdon,

4

secondo la mia conoscenza:

prova a findcomandare in questo modo:

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

La ringrazio per la risposta. ./Dirc/* significa: ./home/securityfolder1/* o è sbagliato?
Jacco van de Wijgaart,

L'ho appena provato nella mia virtualbox find /home/jacco/ -mtime +1 -type f -deletee sembra che funzioni. Come posso automatizzare questo?
Jacco van de Wijgaart,

crea un file di script e attiva questo comando usando script se funziona piuttosto che esegui il tuo file di script all'avvio.
Maulik Patel,

sono come il supernoob proprio qui perché parte della creazione dello script, significa un file con #!/bin/bashe il codice sotto quello? o sono davvero stupido proprio qui?
Jacco van de Wijgaart,

2
@Melebius no, il percorso non deve essere citato, specialmente quando contiene caratteri glob. Si vuole per essere ampliato con il guscio e la citazione potrebbe bloccare questo. Provate, per esempio: find '/u*' -name local. Si tratta di direttive del genere -name "foo*"che dovrebbero essere citate quando contengono caratteri glob.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.