find /var/log/myfile.*.txt -type f
Wenn keine Datei vorhanden ist, die diesem Muster entspricht, erhalte ich Fehlerprotokolle wie No such file or directory
.
Frage: wie kann ich nur diese Fehlermeldung verhindern? Ich könnte natürlich 2>/dev/null
am Ende ein hinzufügen, aber das würde alle Fehler unterdrücken. Wie könnte ich die genannte einfach ignorieren?
Denn ich habe einen Cronjob, der periodisch einige Dateien löscht und immer dann Fehler loggt, wenn keine Datei vorhanden war:
@daily find /var/log/myfile.*.txt -mtime +7 -delete
Antwort1
Das Richtige ist in diesem Fall, diese Meldung gar nicht erst auszulösen.
Wenn Sie dies in einer Shell ausführen
find /var/log/myfile.*.txt -type f
/var/log/myfile.*.txt
wird von der Shell erweitert; find
ruft erweiterte Objekte oder Literale ab, /var/log/myfile.*.txt
wenn keine Übereinstimmung vorhanden ist. Im letzteren Fall wird ausgelöst No such file or directory
.
Sie können zunächst eine Dummy-Datei erstellen: touch '/var/log/myfile.dummy_name.txt'
(vgl.Elefant in Kairo). Wirklich elegant ist diese „Lösung“ allerdings nicht.
Eine bessere Lösung besteht darin, find
das Muster handhaben zu lassen:
find /var/log/ -type f -name "myfile.*.txt"
wobei doppelte Anführungszeichen das Globbing in der Shell verhindern (vgl.Das). In diesem Fall *
wird es von find
selbst gehandhabt, da -name
solche Muster unterstützt werden.
Der obige Ansatz kann jedoch myfile.*.txt
inbeliebiges Unterverzeichnisvon /var/log/
auch. Wenn Ihr find
unterstützt -maxdepth
, verwenden Sie es:
find /var/log/ -maxdepth 1 -type f -name "myfile.*.txt"
Wenn nicht, siehe dies:POSIX-Suche auf bestimmte Tiefe beschränken?
Ihr Betriebssystem verwendet wahrscheinlich bereits logrotate(8)
Protokolldateien.
In meinem Debian logrotate
läuft es täglich wegen /etc/cron.daily/logrotate
; in Ubuntu sollte es ähnlich sein. Ich kann eine benutzerdefinierte Konfiguration erstellen /etc/logrotate.d/
und auf diese Weise beliebige Protokolldateien verwalten. Betrachten Sie diesen Ansatz.