web-dev-qa-db-de.com

Das letzte Änderungsdatum einer Datei in Bash drucken

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
97
Hokerie

Sie können den Befehl stat Verwenden

stat -c %y "$entry"

Mehr Info

% y Zeitpunkt der letzten Änderung, lesbar 
106
Steven Penny

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"
165
mmond

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

12
Danijel-James W

Zusätzlich zur @StevePenny-Antwort möchten Sie vielleicht den nicht so lesbaren Teil ausschneiden:

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

Am besten ist date -r filename +"%Y-%m-%d %H:%M:%S

3
rishi

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)
2

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
2
Hokerie

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
2
Anton Kiggundu

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")}'
1
Bill

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.

0
Yoga Nathan