Drucken Sie das letzte Änderungsdatum einer Datei in Bash


147

Ich kann anscheinend nicht herausfinden, wie das Datum einer Datei ausgedruckt werden soll. Ich bin bisher in der Lage, alle Dateien in einem Verzeichnis auszudrucken, aber ich muss die Daten damit ausdrucken.

Ich weiß, dass ich ein Datumsformat mit dem Echo des Eintrags anhängen muss, aber alles, was ich nicht finden kann, ist das richtige Format.

echo "Please type in the directory you want all the files to be listed"

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done

2
read -p "Bitte geben Sie das Verzeichnis ein, in dem alle Dateien aufgelistet werden sollen"
CousinCocaine

Antworten:


146

Sie können den stat Befehl verwenden

stat -c %y "$entry"

Mehr Info

% y Zeitpunkt der letzten Änderung, lesbar

for entry in "$directory"/* do stat -c%y "$entry" done Funktioniert nicht
Druckt

Hm, könnte es mein Unbuntu sein? Wissen Sie, welche Anforderungen an die Verwendung gestellt statwerden?
Hokerie

33
Beachten Sie, dass es unter OS X (Mac) ist stat -f "%m%t%Sm %N" filename(siehe man stat Beispiele für weitere Details)
Olie

3
Beachten Sie, dass der statBefehl unter BSD eine andere Syntax hat. Mein Fall für FreeBSD : stat -f %Sm -t %F" "%R filename.
Sopalajo de Arrierez

228

Ist der Befehl 'Datum' nicht viel einfacher? Keine Notwendigkeit für awk, stat, etc.

date -r <filename>

Überprüfen Sie auch die Manpage auf Datumsformatierung. Zum Beispiel mit dem üblichen Datums- und Uhrzeitformat:

date -r <filename> "+%m-%d-%Y %H:%M:%S"

11
Viel einfacher als mit stat / more verfügbar.
Ing

11
Es sieht so aus, als ob BSD (oder zumindest OS X) datedies nicht haben. Es -rwird nur verwendet, um einen Zeitstempel zum Formatieren bereitzustellen. Sie müssen das GNU-Datum verwenden, um diese Funktionalität zu erhalten.
Waleed Khan

4
Unter OSX verwenden: Datumstat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007

3
Unter OS X 10.10 funktioniert das Datum -r <Dateiname> wie angekündigt, obwohl auf der Manpage kein <Dateiname> -Argument beschrieben wird.
Gotofritz

3
In macOS 10.13 date [-r seconds | filename]ist auf der manSeite vollständig dokumentiert und funktioniert wie erwartet.
Echelon

14

Unter OS X möchte ich, dass mein Datum im Format YYYY-MM-DD HH:MMder Ausgabe für die Datei vorliegt.

Um eine Datei anzugeben, würde ich Folgendes verwenden:

stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename]

Wenn ich es für eine Reihe von Dateien ausführen möchte, kann ich Folgendes tun:

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
done

In diesem Beispiel wird das letzte Mal gedruckt, als ich den sudo periodic daily weekly monthlyBefehl ausgeführt habe, da er auf die Protokolldateien verweist.


Um die Dateinamen unter jedem Datum hinzuzufügen, würde ich stattdessen Folgendes ausführen:

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
  echo "$i"
done

Die Ausgabe wäre die folgende:

2016-40-01 16:40
/var/log/daily.out
2016-40-01 16:40
/var/log/monthly.out
2016-40-01 16:40
/var/log/weekly.out

Leider bin ich mir nicht sicher, wie ich den Zeilenumbruch verhindern und den Dateinamen an das Ende des Datums anhängen kann, ohne dem Skript weitere Zeilen hinzuzufügen.


PS - Ich verwende es #!/usr/bin/env bashtagsüber als Python-Benutzer und habe bashstattdessen verschiedene Versionen von auf meinem System installiert#!/bin/bash


Falls Sie den Zeilenumbruch nicht herausgefunden haben, ist das Flag -e für das Echo-Programm verfügbar. Beispiel für eine Verwendung könnte sein : echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile.". In Ihrem Fall könnte es sein: echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
Thoth


6

Wenn Sie die Antwort von @StevePenny hinzufügen, möchten Sie möglicherweise den nicht so menschlich lesbaren Teil ausschneiden:

stat -c%y Localizable.strings | cut -d'.' -f1

3

Ich wollte das Änderungsdatum einer Datei im YYYYMMDDHHMMSSFormat erhalten. So habe ich es gemacht:

date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S

Erläuterung. Es ist die Kombination dieser Befehle:

stat -c %Y myfile.css # Get the modification date as a timestamp
date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp)

2

BEARBEITET: Es stellt sich heraus, dass ich die Anführungszeichen vergessen habe, die $entryzum korrekten Drucken erforderlich sind, und nicht den Fehler "Keine solche Datei oder kein solches Verzeichnis" ausgegeben habe. Vielen Dank, dass Sie mir geholfen haben!

Hier ist mein endgültiger Code:

    echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates

read directory

for entry in "$directory"/*

do
modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file"
modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty
echo $entry:$modDate

Druckt wie folgt aus:

/home/joanne/Dropbox/cheat sheet.docx:2012-03-14
/home/joanne/Dropbox/Comp:2013-05-05
/home/joanne/Dropbox/Comp 150 java.zip:2013-02-11
/home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11
/home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11
/home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12
/home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11
/home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05
/home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11

2

Für die Zeilenumbrüche habe ich Ihren Code bearbeitet, um etwas ohne Zeilenumbrüche zu erhalten.

#!/bin/bash
for i in /Users/anthonykiggundu/Sites/rku-it/*; do
   t=$(stat -f "%Sm"  -t "%Y-%m-%d %H:%M" "$i")
   echo $t : "${i##*/}"  # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path           
done

1

Wenn der Dateiname keine Leerzeichen enthält:

ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }'

Dies wird im folgenden Format gedruckt:

 Dec   21   20:03   a1.out
 Dec   21   20:04   a.cpp

Wenn Dateinamen Leerzeichen haben (Sie können den folgenden Befehl auch für Dateinamen ohne Leerzeichen verwenden, es sieht nur kompliziert / hässlich aus als das erstere):

 ls -l <dir> | awk '{printf ("%s %s %s ",  $6,  $7, $8); for (i=9;   i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'

Ah ich sehe! Das funktioniert meistens, außer für die Dateien mit den Leerzeichen in den Namen. Gibt es dafür eine Lösung?
Hokerie

Eigentlich habe ich es noch einmal versucht und es funktioniert nicht ... es stellte sich heraus, dass ich ein Verzeichnis mit Dateinamen ohne Leerzeichen ausprobiert habe. = / Bearbeitet meine Antwort unten
Hokerie

Wenn Sie sagen, dass es nicht funktioniert, können Sie sagen, was der Fehler ist? Es funktioniert für mich, wenn ich es auf meinem System ausgeführt habe.
Bill

Ich habe eine "keine solche Datei oder ein solches Verzeichnis".
Hokerie

Das liegt daran, dass Sie einen Wert übergeben haben, der <dir>nicht existiert. Der Code ist vollkommen in Ordnung.
Bill

0

Sie können verwenden:

ls -lrt filename |awk '{print "%02d",$7}'

Dadurch wird das Datum zweistellig angezeigt.

Wenn zwischen 1 bis 9 , wird das Präfix "0" hinzugefügt und in 01 - 09 konvertiert.

Hoffe das entspricht den Erwartungen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.