Ich habe eine Reihe von Protokolldateien in der Form:
log.2014-02-19-10_24_22
D.h. log.JJJJ-MM-TT-H24_MI_SS
Das Datum, das Teil des Namens der Protokolldatei ist, ist das Datum, an dem die Protokolldatei zum ersten Mal erstellt wurde. Ich kann also jederzeit die folgenden Protokolldateien in meinem Verzeichnis haben:
log.2014-02-19-10_18_54
log.2014-02-19-10_21_20
log.2014-02-19-10_23_11
etc.
Jetzt habe ich ein Skript, das von einem Cronjob aufgerufen wird und „alte“ Protokolldateien löscht:
$ cat delete-old-rotated-logs
#!/usr/bin/env bash
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec rm {} ;
Das Problem, mit dem ich konfrontiert bin, ist, dass manchmal der Prozess, der protokolliert, abgestürzt ist, sodass die „neueste“ Protokolldatei nach einiger Zeit ebenfalls „alt“ wird (da kein Prozess darauf schreibt) und gelöscht wird, wodurch ich die Spur verliere. Wie kann ich die delete-old-rotated-logs
neu schreiben Skript so, dass es alte Dateien außer der letzten (oder dem letzten N
) ? Für die Sortierung kann sowohl der Dateiname selbst als auch der Änderungszeitstempel (robuster) verwendet werden.
Akzeptierte Antwort:
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 |
sort | head -n -1 | xargs rm
Oder wenn Sie mtime
verwenden möchten anstelle des Dateinamens:
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec ls -t {} + |
tail -n +2 | xargs rm
Aus den Kommentaren von @Stephane geht hervor, dass ein robusterer Ansatz Folgendes wäre:
IFS=$'n'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log* ! -name $'*n*' -type f -mmin +1800 |
sort | head -n -1 )
Oder für die POSIX-Shell (erfordert weiterhin GNU-Tools):
IFS='
'
ex_newline='*
*'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log* ! -name "$ex_newline" -type f -mmin +1800 |
sort | head -n -1 )
Eine einzelne (robuste) Pipeline kann mit einer neueren Version von GNU sed
verwendet werden /sort
(und GNU find wie bei allen oben genannten):
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -print0 |
sort -z | sed -z '$d' | xargs -0 rm