Linux-Bash-Skript für die älteste Datei in einem Ordner + Rückgabewert, wenn der Ordner leer ist

629
knob

Ich verwende SUSE Linux Enterprise Server 11 (x86_64).
Ich muss die älteste Datei eines Ordners suchen und sie in Unixtime ausdrucken. Ich habe die Arbeit mit diesem einen Liner erledigt:
find $1 -maxdepth 1 -type f | xargs -i stat -c "%Y" '{}' | sort | head -n 1
($ 1 ist für Zabbix)

Wenn der Ordner jedoch leer ist, scheint der Wert ebenfalls leer zu sein, und meine Überwachungssoftware Zabbix kann keine leeren Werte verarbeiten, so dass ich es brauche, um beispielsweise die Nummer 0 auszudrucken, wenn der Ordner leer ist.

Okay, als nächstes habe ich dieses wunderschöne Drehbuch verfasst, aber wie ihr alle sehen könnt, ist es ziemlich schait. Könnte mir jemand dabei helfen?
Zu Ihrer Information. Ich habe vor zwei Tagen angefangen, mich mit Linux zu beschäftigen

#!/bin/bash  export fileage fileage=$(find -maxdepth 1 -type f | xargs -i stat -c "%Y" '{}' | sort | head -n 1) if [ $? -eq 0 ] then echo "0"  else echo "fileage" fi 
1

1 Antwort auf die Frage

2
Gombai Sándor

find kann alle 3 Zeitstempel drucken, die eine Datei / ein Verzeichnis haben kann. Sie müssen -printf nur mit der entsprechenden Formatsequenz verwenden: % C @ oder % A @ oder % T @ (siehe Detail ist Man find ).

Wie für leere Verzeichnisse prüfen, ob $? is 0 kann irreführend sein, weil 0-Rückkehrcode bedeutet, dass "nichts Schlimmes passiert ist", und ein leeres Verzeichnis nicht "etwas Schlechtes" zählt, es ist nur ein spezieller, aber normaler Fall. Sie können aber den OUTPUT von find (und die folgenden Befehle in der Pipe) speichern und prüfen, ob er leer ist oder nicht.

Mögen

fileage=$(find $1 -maxdepth 1 -type f -printf "%T@\n" | sort | head -n 1) if [ -z "fileage" ]; then echo 0 else echo $fileage fi 

oder, wenn Sie kurz sein möchten:

fileage=$(find $1 -maxdepth 1 -type f -printf "%T@\n" | sort | head -n 1) echo $ 

Seien Sie jedoch vorsichtig, wenn Sie wirklich "älteste Datei" sehen möchten, da dies das Lesen der Erstellungszeit der Datei bedeuten würde und nicht gespeichert wird. Sie könnten die älteste Datei mit der neuesten aller drei Zeitstempel haben.

Prost für Ihre Hilfe! Jetzt habe ich ein anderes Problem. Ich habe das Skript im Ordner /home/logia/zabbix/script/fileage.bash. Ich gab ihm mit chmod + x ausführbare Rechte. Wenn ich das Skript ausführte, indem ich /home/logia/zabbix/script/fileage.bash schreibe, erhalte ich einen Fehler "-bash: /home/logia/zabbix/script/fileage.bash : / bin / bash ^ M: falscher Interpreter: Keine solche Datei oder Verzeichnis "und ich habe die Datei im ASCII-Format übertragen. Irgendwelche Ratschläge? knob vor 7 Jahren 0
Ihre Skriptdatei liegt im DOS-Format vor. Die Zeilen werden mit 0xOD 0x0A-Zeichen und nicht nur mit 0x0A abgeschlossen. Sie können dies mithilfe von sed (erfordert etwas Erfahrung), anderen Shell-Tools oder Ihrem Editor mit Hilfe der Funktion zum Festlegen der Leitungsbeendigung unterstützen. Ich kann dir sagen, wie man das mit vi macht. Geben Sie alles wie geschrieben ein (ohne die Nummern) 1) vi-Skript 2): set fileformat = dos 3): wq Gombai Sándor vor 7 Jahren 0
Danke, Bruder, jetzt geht es! Das Ändern der EOL-Konvertierungsoption von Notepad ++ hat den Trick bewirkt knob vor 7 Jahren 0