2008-10-30 10 views
144

Ich schreibe ein Bash-Skript, das alte Dateien löschen muss.So löschen Sie Dateien älter als X Stunden

Aktuelle Zeit ist implementiert:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete 

Dies wird älter als 1 Tag der Dateien löschen.

Aber was ist, wenn ich eine feinere Auflösung brauche, die 1 Tag, sagen wir 6 Stunden alt ist? Gibt es einen schönen, sauberen Weg, wie es mit find und -mtime funktioniert?

Antwort

222

Hat Ihre find die Option -mmin? Das kann man die Anzahl der Minuten seit der letzten Änderung lassen testen:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete 

Oder vielleicht sehen tmpwatch mit der gleichen Arbeit zu tun. phjr empfahl auch tmpreaper in den Kommentaren.

+5

Danke für die Antworten jeder, -mmin ist genau das, was ich brauchte :) irgendwie habe ich es in der Manpage verpasst. –

+2

Mine hat nicht -mmin :( – xtofl

+1

tmpwatch ist für dich dann! –

2

-min ist für Minuten.

Versuchen Sie, die man-Seite zu betrachten.

man find 

für weitere Typen.

7

Sie könnten zu diesem Trick: Erstellen Sie eine Datei vor 1 Stunde, und verwenden Sie das -newer file Argument.

(Oder verwenden Sie touch -t, um eine solche Datei zu erstellen).

+2

Ja, ich habe diesen Trick gefunden i n google, jedoch ist -mmin viel eleganter. –

+1

gibt es keinen -older-Schalter (zumindest in meinem Befehl find), und das wäre was benötigt würde. -Neuer hilft nicht. – iconoclast

+5

@Brandon: zum Glück gibt es den '!' Operator ... – xtofl

1

Für SunOS 5,10

Example 6 Selecting a File Using 24-hour Mode 


The descriptions of -atime, -ctime, and -mtime use the ter- 
minology n ``24-hour periods''. For example, a file accessed 
at 23:59 is selected by: 


    example% find . -atime -1 -print 




at 00:01 the next day (less than 24 hours later, not more 
than one day ago). The midnight boundary between days has no 
effect on the 24-hour calculation. 
0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;

0

Hier ist, was man für den Gang auf dem Weg zu tun @iconoclast wurde etwa auf eine andere Antwort in ihren comment fragen.

Verwendung crontab für Benutzer oder ein /etc/crontab erstellen Datei /tmp/hour:

# m h dom mon dow user command 
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1 

und dann die zum Ausführen des Befehls verwenden:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \; 
+0

Kein Problem. @ericaya hat tatsächlich das meiste davon gemacht, ich habe gerade die Dinge überarbeitet. –

+0

'*/1' für stündlich ist in Ihrer crontab redundant. Es ist das gleiche wie * im Stundenfeld zu setzen. – colminator

+0

@columnator-Sie haben Recht, ich habe meinen Eintrag korrigiert. – satyr0909

0

Wenn Sie "-mmin" nicht in Ihrem Version von "finden", dann "-mtime -0.041667" wird ziemlich nah an "innerhalb der letzten Stunde", so in Ihrem Fall, verwenden Sie:

-mtime +(X * 0.041667) 

so, wenn X 6 Stunden bedeutet, dann:

find . -mtime +0.25 -ls 

funktioniert, weil 24 Stunden * 0,25 = 6 Stunden

1

Hier ist der Ansatz, die für mich gearbeitet (und ich sehe es nicht verwendet wird, oben)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null 

Löschen aller Dateien, die älter als 59 Minuten sind, während die Ordner intakt bleiben.

Verwandte Themen