Wie kann ich die geänderte Zeit einer Datei anzeigen?

35

Ich möchte eine Methode zum Suchen und Drucken der geänderten Zeit einer Datei zur Verwendung in einem Bash-Skript.

Ich habe mir ausgedacht:

ls -l $filename | cut -d ' ' -f '6-8'

Welche Ausgänge:

Jul 26 15:05

Obwohl ich das Parsen vermeiden lsmöchte, wäre es auch nützlich, das Jahr dort zu haben.

Idealerweise möchte ich eine Ausgabe ähnlich der Standardausgabe des dateBefehls sehen.

Tue Jul 26 15:20:59 BST 2016

Welche anderen nützlichen Methoden gibt es?

Arronisch
quelle

Antworten:

46

Nicht verwenden ls, dies ist ein Job für stat:

stat -c '%y' filename

-c Lassen Sie uns hier eine spezifische Ausgabe erhalten %y wird der letzte Änderungszeitpunkt der Datei in lesbarem Format angezeigt. So ermitteln Sie die Zeit in Sekunden seit der Verwendung von "Epoch" %Y:

stat -c '%Y' filename

Wenn Sie den Dateinamen auch möchten, verwenden Sie %n :

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Stellen Sie die Formatangaben entsprechend Ihren Anforderungen ein. Überprüfen Sie man stat.

Beispiel:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Wenn Sie die Ausgabe wie möchten Tue Jul 26 15:20:59 BST 2016, verwenden Sie die Epochenzeit als Eingabe für date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Überprüfen Sie datedie Formatangaben, um Ihren Anforderungen zu entsprechen. Siehe man dateauch

heemayl
quelle
5
Bedenken Sie bei dieser Antwort, dass die lsImplementierung systemübergreifend inkonsistent ist und daher niemals für irgendeine Art von Automatisierung verwendet werden sollte. Verwenden Sie stattdessen Befehle wie statund, findwenn Sie Skripts schreiben.
Paddy Landau
1
Ausgezeichnet. Ich hatte von diesem kleinen Schatz nichts gewusst. So viele von ihnen in der * nix / linux-Umgebung müssen erst noch entdeckt werden.
Ken Ingram
1

Ich habe es versucht

ls -l $filename | cut -d ' ' -f '6-8'

Liegt das Datum jedoch unter 10, fehlt die Uhrzeit. Dies liegt an dem zusätzlichen Platz vor dem Datum, wenn er kleiner als 10 ist. Versuchen Sie Folgendes:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

Der Befehl awk gibt die durch alle Leerzeichen (-F '') getrennten Felder aus. Hoffe, es funktioniert. Ich weiß, dass dies nicht die ursprüngliche Frage beantwortet, sondern nur eine Erläuterung des Befehls ls für Datum und Uhrzeit. Wenn Sie "ubuntu get date and time of file" von Google aufrufen, wird diese Frage oben aufgelistet. Nach dieser Frage habe ich gesucht, da ich das Jahr auch nicht benötige. Für Jahr, Datum und Uhrzeit können Sie einen der folgenden Befehle ausführen. % m gibt die Monatszahl aus. % b gibt die Abkürzung für den Monat aus: Löschen Sie% H:% M, wenn Sie Stunde und Minute nicht benötigen. % -d gibt für den Tag des Monats keine führende Null aus.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
te7
quelle