2012-11-21 5 views
82

Sono nuovo agli script di shell, qualcuno può aiutarti? Voglio cancellare gli script in una cartella dalla data corrente a 10 giorni. Gli script appare come:Elimina file più vecchi di 10 giorni usando lo script di shell in Unix

2012.11.21.09_33_52.script 
2012.11.21.09_33_56.script 
2012.11.21.09_33_59.script 

Lo script verrà eseguito in tutti i 10 giorni con Crontab, è per questo che ho bisogno la data corrente.

+0

si fecero a h dare un'occhiata a 'man date'? – Jens

+3

Hai bisogno di cancellare in base al nome del file o al tempo di modifica del file? – Barmar

+0

ho bisogno di un intero script :) trovo un esapmo ma non sono sicuro che questo sia un buon risultato: trovare/home/script /. -name '* .script' -mtime +10 -exec rm -rf '{}' \; – Steve88

risposta

283

find è lo strumento comune per questo tipo di compito:

find ./my_dir -mtime +10 -type f -delete 

SPIEGAZIONI

  • ./my_dir l'elenco (sostituire w esimo il proprio)
  • -mtime +10 più di 10 giorni
  • -type f file solo
  • -delete non è una sorpresa. Rimuoverlo per testare il vostro filtro find prima di eseguire l'intero comando di

E fare in modo che ./my_dir esiste per evitare brutte sorprese!

+0

'find /home/scripts/*.script -mtime +10 type f -delete' sarà ok per cancellare questi? 2012.11.21.09_33_52.script 2012.11.21.09_33_56.script 2012.11.21.09_33_59.script – Steve88

+0

Dipende della data della modifica, come quello ls display -l'. La data è la stessa di "ls -l"?Ma un semplice test ti dirà =) –

+0

sì, è una data creartion della sceneggiatura – Steve88

4

Se potete permettervi di lavoro tramite i dati del file, si può fare

find -mmin +14400 -delete 
+1

Per [editor anonimo] (http://stackoverflow.com/review/suggested-edits/5805137): Quale versione se 'find' ha l'opzione' -rm-rf'? – glglgl

11

Basta vivacizzare lo script di shell per eliminare i file più vecchi

#!/bin/bash 

timestamp=$(date +%Y%m%d_%H%M%S) 
path="/data/backuplog" 
filename=log_back_$timestamp.txt 
log=$path/$filename 

find $path -name "*.txt" -type f -mtime +7 -print -delete >> $log 

echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> $log 

START_TIME=$(date +%s) 

... code for backup ...or any other operation .... 


END_TIME=$(date +%s) 

ELAPSED_TIME=$(expr $END_TIME - $START_TIME) 


echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> $log 
echo "Elapsed Time :: $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss) " >> $log 

La build del codice sulla risposta di Sputnick e aggiunge un paio di cose.

  • file di registro denominato con un timestamp
  • cartella
  • log specificato
  • find ricerca i file * .txt solo nella cartella di registro
  • file di log più vecchi di 7 giorni vengono eliminate (sempre che sia per un registro di backup)
  • note l'ora di inizio/fine
  • calcola il tempo trascorso ...
+0

Ciao @MarcoZen. Ho 2 comandi 'find' e' delete' che scrivono allo stesso '$ log'. Perché crea tre file di registro con i primi due senza contenuto e l'ultimo file con l'elenco dei file cancellato. Cosa posso fare in modo che il comando trova ed elimina non generi più file? –

+0

@FokwaBest - Potrebbe essere stato creato un file di registro anomalo? bcos del timestamp? Stai usando completamente il codice sopra? Puoi incollarmi per me per controllare? – MarcoZen

+0

Ciao @MarcoZen, ho dovuto rimuovere '_% H% M% S'. Per i file di piccole dimensioni, è stato generato un solo file di registro, ma quando la dimensione del numero di file da eliminare è grande, è stato generato più file di registro con diversi '_% H% M% S'. Dopo aver rimosso questa parte, tutto è scritto in un file. –