GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Alte Protokolldateien außer der letzten löschen (alphanumerisch sortiert)?

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

Linux
  1. Verschieben Sie alle Dateien bis auf eine

  2. Bash-Skript zum Löschen aller bis auf N Dateien bei alphabetischer Sortierung

  3. Wie lösche ich alle Dateien in einem Verzeichnis außer einigen?

  4. Melden Sie einen Benutzer ab und löschen Sie das Konto

  5. Alle /var/log löschen?

3 Möglichkeiten zum Löschen aller Dateien in einem Verzeichnis außer einer oder wenigen Dateien mit Erweiterungen

Alle Dateien/Verzeichnisse außer einer Datei entfernen?

Alle Dateien außer in einem bestimmten Unterverzeichnis löschen mit Suchen?

3 Methoden zum Anzeigen der tail -f-Ausgabe mehrerer Protokolldateien in einem Terminal

Dateien mit logrotate löschen

Grep in einer riesigen Logdatei (>14 GB) nur die letzten x GB?