Ich möchte in Linux Bash überprüfen, ob eine Datei vor mehr als x Zeit erstellt wurde.
Angenommen, die Datei heißt text.txt und die Zeit beträgt 2 Stunden.
if [ what? ]
then
echo "old enough"
fi
linux
bash
command-line
Flybywire
quelle
quelle
find
nicht Null zurückgegeben wird, wenn keine Übereinstimmungen gefunden werden.text.txt
wird davon ausgegangen, dass es sich nicht um ein Verzeichnis handelt.[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Ich habe es immer gemocht
date -r /the/file +%s
, sein Alter zu finden.Sie können auch
touch --date '2015-10-10 9:55' /tmp/file
eine extrem feinkörnige Zeit an einem beliebigen Datum / einer beliebigen Uhrzeit ermitteln.quelle
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
die, wenn nicht veraltet , mindestens alt und weniger tragbar ist und$(( ))
stattdessen verwendet werden sollte; und Backquotes sind zerbrechlicher als$( )
; Außerdem können Bindestriche in Funktionsnamen möglicherweise nicht vollständig portierbar sein. Das Wesentliche ist jedoch gut!Mit dem
stat
, um das letzte Änderungsdatum der Dateidate
herauszufinden, um die aktuelle Zeit und eine großzügige Verwendung von Bashismen herauszufinden, können Sie den gewünschten Test basierend auf der letzten Änderungszeit der Datei durchführen 1 .Der Code ist zwar etwas weniger lesbar als der
find
Ansatz, aber ich denke, er ist besser als das Ausführenfind
einer Datei, die Sie bereits "gefunden" haben. Auch Datumsmanipulation macht Spaß ;-)%Z
anstelle von%Y
unten verwendet, um die "Änderungszeit" zu erhalten, die möglicherweise Ihren Wünschen entspricht.[Aktualisieren]
Verwenden Sie für Mac-Benutzer
stat -f "%m" $somefile
anstelle der oben angegebenen Linux-spezifischen Syntaxquelle
stat
ist nicht eingebaut - sehr schlecht von mir, werde ich reparieren.Die Erstellungszeit wird nicht gespeichert.
Was gespeichert werden, sind drei Zeitstempel (im Allgemeinen können sie auf bestimmten Dateisystemen oder durch bestimmte Dateisystemoptionen deaktiviert werden):
Eine "Änderung" der Datei wird als Berechtigungsänderung, Umbenennung usw. gezählt, während die Änderung nur Inhalt ist.
quelle
Obwohl ctime technisch gesehen nicht die Zeit der Erstellung ist, ist es dies ziemlich oft.
Da ctime nicht von Änderungen am Inhalt der Datei betroffen ist, wird es normalerweise nur aktualisiert, wenn die Datei erstellt wird. Und ja - ich kann Sie alle schreien hören - es wird auch aktualisiert, wenn Sie die Zugriffsberechtigungen oder den Besitz ändern ... aber im Allgemeinen geschieht dies einmal, normalerweise zur gleichen Zeit, zu der Sie die Datei dort ablegen.
Persönlich benutze ich mtime immer für alles und ich stelle mir vor, dass Sie das wollen. Aber trotzdem ... hier ist eine Wiederholung von Guss '"unattraktivem" Bash in einer einfach zu bedienenden Funktion.
quelle
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…chmod
, auf die Datei angewendetes Element diese Idee zunichte macht. Aber ich kann damit leben , dass du das tust ;-)+%s
aus der zweiten Hälfteage() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(Danke an @Grizly für die Korrektur!)noatime
Option bereitgestellten Dateisysteme ist (was für die Leistung gut ist, daher sollten Sie sie verwenden). Also einfach%X
anstelle von verwenden%Y
.Das Finden ist gut, aber ich denke, Sie können es auch anders verwenden, besonders wenn Sie jetzt wissen müssen, wie viele Sekunden die Datei alt ist
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
mit GNU Datum
quelle
Betrachten Sie das Ergebnis des Tools 'stat':
Sie können hier die drei Daten für Zugriff / Ändern / Ändern sehen. Es gibt kein Erstellungsdatum. Sie können nur wirklich sicher sein, wann der Dateiinhalt geändert wurde (das Feld "Ändern") oder der Inode geändert wurde (das Feld "Ändern").
Beispiele dafür, wann beide Felder aktualisiert werden:
"Ändern" wird aktualisiert, wenn jemand zusätzliche Informationen an das Ende der Datei angekettet hat.
"Ändern" wird aktualisiert, wenn jemand die Berechtigungen über chmod geändert hat.
quelle
ich benutze
quelle