Ich finde nicht, wie ich das Datum einer Datei ausdrucken kann. Ich kann bis jetzt alle Dateien in einem Verzeichnis ausdrucken, aber ich muss die Daten damit ausdrucken.
Ich weiß, dass ich ein Datumsformat mit dem Echo des Eintrags anfügen muss, aber alles, was ich finde, kann das richtige Format nicht finden.
echo "Please type in the directory you want all the files to be listed"
read directory
for entry in "$directory"/*
do
echo "$entry"
done
Sie können den Befehl stat
Verwenden
stat -c %y "$entry"
Mehr Info
% y Zeitpunkt der letzten Änderung, lesbar
Ist der Befehl "Datum" nicht viel einfacher? Keine Notwendigkeit für awk, stat usw.
date -r <filename>
Betrachten Sie auch die man-Seite zur Datumsformatierung. zum Beispiel mit dem üblichen Datums- und Uhrzeitformat:
date -r <filename> "+%m-%d-%Y %H:%M:%S"
Unter OS X möchte ich, dass mein Datum in der Ausgabe für die Datei das Format YYYY-MM-DD HH:MM
hat.
Um eine Datei anzugeben, würde ich 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
Dieses Beispiel wird beim letzten Ausführen des Befehls Sudo periodic daily weekly monthly
gedruckt, da er auf die Protokolldateien verweist.
Um die Dateinamen unter jedem Datum hinzuzufügen, führe ich stattdessen Folgendes aus:
#!/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 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 benutze #!/usr/bin/env bash
als Python-Benutzer am Tag und habe verschiedene Versionen von bash
auf meinem System anstelle von #!/bin/bash
installiert
Zusätzlich zur @StevePenny-Antwort möchten Sie vielleicht den nicht so lesbaren Teil ausschneiden:
stat -c%y Localizable.strings | cut -d'.' -f1
Am besten ist date -r filename +"%Y-%m-%d %H:%M:%S
Ich wollte das Änderungsdatum einer Datei im YYYYMMDDHHMMSS
-Format erhalten. So habe ich es gemacht:
date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S
Erklärung. 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)
BEARBEITET: stellt sich heraus, dass ich die Anführungszeichen für $entry
vergessen hatte, um korrekt zu drucken und nicht den Fehler "Keine solche Datei oder ein solches Verzeichnis" zu geben. 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
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
Wenn der Dateiname keine Leerzeichen enthält:
ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }'
Dies wird in folgendem Format gedruckt:
Dec 21 20:03 a1.out
Dec 21 20:04 a.cpp
Wenn Dateinamen Platz haben (Sie können den folgenden Befehl auch für Dateinamen ohne Leerzeichen verwenden, es sieht nur komplizierter/hässlicher aus als der vorherige):
ls -l <dir> | awk '{printf ("%s %s %s ", $6, $7, $8); for (i=9; i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'
Sie können verwenden:
ls -lrt filename |awk '{print "%02d",$7}'
Dadurch wird das Datum 2-stellig angezeigt.
Wenn sie sich zwischen 1 bis 9 befindet, fügt sie dem Präfix "0" hinzu und konvertiert in 01 - 09.
Hoffe das entspricht der Erwartung.