Ich schreibe ein Bash-Skript, das alte Dateien löschen muss.
Es wird derzeit implementiert mit:
find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete
Dadurch werden die Dateien gelöscht, die älter als 1 Tag sind.
Was ist jedoch, wenn ich an diesem Tag eine feinere Auflösung benötige, beispielsweise 6 Stunden alt? Gibt es eine schöne, saubere Möglichkeit, wie es find und -mtime verwendet?
$LOCATION
und$REQUIRED_FILES
kann beide mehrere Werte wiedir1 dir2
und haben*.txt *.tmp
?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).quelle
touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) test
Erstellt eine Dateitest
, die immer 1 Stunde alt ist.Hier ist der Ansatz, der für mich funktioniert hat (und ich sehe nicht, dass er oben verwendet wird)
Löschen aller Dateien, die älter als 59 Minuten sind, während die Ordner intakt bleiben.
quelle
'*.*'
oder die Shell erweitert es auf tatsächliche Dateinamen, anstatt es als Platzhalter fürfind
die Auflösung beizubehalten. Diesfind
unterbricht die rekursive Operation für Unterverzeichnisse.-name '*.*'
wird nicht löschen Dateien , die keine Erweiterung haben, wieREADME
,Makefile
etc.Für SunOS 5.10
quelle
-mmin ist für Minuten.
Schauen Sie sich die Manpage an.
für mehr Typen.
quelle
Wenn Sie in Ihrer Version von "find" nicht "-mmin" haben, kommt "-mtime -0.041667" "innerhalb der letzten Stunde" ziemlich nahe. Verwenden Sie in Ihrem Fall also:
Wenn X also 6 Stunden bedeutet, dann:
funktioniert, weil 24 Stunden * 0,25 = 6 Stunden
quelle
Hier ist, was man tun kann, um den Weg zu gehen, über den sich @iconoclast in seinem Kommentar zu einer anderen Antwort gewundert hat .
Verwenden Sie crontab als Benutzer oder
/etc/crontab
zum Erstellen einer Datei/tmp/hour
:und verwenden Sie dies, um Ihren Befehl auszuführen:
quelle
*/1
denn stündlich ist in Ihrem crontab überflüssig. Es ist dasselbe wie * in das Stundenfeld zu setzen.find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;
quelle
Wenn man
find
nicht hat-mmin
und wenn man auch mit einem feststecktfind
, der nur ganzzahlige Werte akzeptiert-mtime
, dann ist nicht unbedingt alles verloren, wenn man bedenkt, dass "älter als" ähnlich ist wie "nicht neuer als".Wenn wir in der Lage waren, eine Datei zu erstellen, die eine Zeitspanne unserer Grenzzeit hat, können wir Sie bitten
find
, die Dateien zu suchen, die "nicht neuer als" unsere Referenzdatei sind.Das Erstellen einer Datei mit dem richtigen Zeitstempel ist etwas kompliziert, da ein System, das nicht über einen angemessenen verfügt,
find
wahrscheinlich auch über einen weniger als fähigendate
Befehl verfügt, der beispielsweise Folgendes ausführen kann :date +%Y%m%d%H%M%S -d "6 hours ago"
.Glücklicherweise andere alte Tools, die dies verwalten können, wenn auch auf unhandlichere Weise.
Bedenken Sie, dass sechs Stunden 21600 Sekunden sind. Wir möchten die Zeit vor sechs Stunden in einem nützlichen Format ermitteln:
Die Perl-Anweisung hat zwar ein nützliches Datum hervorgebracht, muss aber besser genutzt werden:
Die Lösung für dieses alte UNIX lautet nun wie folgt:
Es könnte auch eine gute Idee sein, unsere Referenzdatei zu bereinigen ...
quelle