Alter der angegebenen Datei abrufen

12

Wie kann ich das Alter einer bestimmten Datei in mindestens Tagen ermitteln?

Ich kenne ls -lhund ähnliche Befehle. Ich möchte etwas, das in etwa so funktioniert:

getfage <FILE> # prints out '12d' (12 days)

Auch dies muss etwas plattformübergreifend sein, da ich dies auch unter Mac OS X verwenden möchte, aber der primäre Anwendungsfall ist auf meiner Linux-Box.

HINWEIS

Da Linux die Erstellungszeit nicht protokolliert , suche ich nach einer zweifachen Lösung: eine für mtime (Linux) - das ist das letzte Mal, als die Datei geändert wurde - und eine für Mac OS X, mit der beide umgehen können mtime oder Erstellungszeit.

Alexej Magura
quelle
@slm Hier geht es speziell um die Erstellungszeit. Es geht nicht darum, das Alter in der Befehlszeile zu berechnen.
Gilles 'SO- hör auf böse zu sein'
@terdon, nicht wirklich. Siehe meinen Hinweis oben.
Alexej Magura
@AlexejMagura und wie tun die Antworten in der Dupe nichts für dich? statgibt dir alles was du brauchst oder?
terdon

Antworten:

16

Unix verfolgt kein Erstellungsdatum. Die einzigen verfügbaren Informationen sind in der Regel die letzten Male, an denen die Dateien vorhanden waren:

  1. Zugegriffen
  2. Geändert
  3. Geändert
  • Zugriff - das letzte Mal, wenn die Datei gelesen wurde
  • Ändern - der letzte Zeitpunkt, zu dem die Datei geändert wurde (Inhalt wurde geändert)
  • Ändern - das letzte Mal, wenn Metadaten der Datei geändert wurden (z. B. Berechtigungen)

( Aus dieser Antwort )

Mit dem statBefehl können Sie Daten abrufen, die sich auf eine bestimmte Datei beziehen .

Beispiel

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX und HFS

Wenn Sie OSX verwenden, ist das Dateisystem, das unter diesem Unix verwendet wird, HFS . Dies ist eine der wenigen (die mir bekannt sind), die das Erstellungsdatum im Dateisystem zusammen mit der Änderungszeit usw. ähnlich wie bei anderen Unixen beibehält.

Auszug

In einem Dateidatensatz werden verschiedene Metadaten zur Datei gespeichert, darunter die CNID, die Größe der Datei, drei Zeitstempel (als die Datei erstellt, zuletzt geändert und zuletzt gesichert wurde), die ersten Dateibereiche der Daten- und Ressourcenabschnitte und -zeiger zu den ersten Daten- und Ressourcenbereichsdatensätzen der Datei in der Extent Overflow-Datei. Der Dateidatensatz speichert außerdem zwei 16-Byte-Felder, die vom Finder zum Speichern von Attributen für die Datei verwendet werden, einschließlich des Erstellercodes, des Typcodes, des Fensters, in dem die Datei angezeigt werden soll, und des Speicherorts innerhalb des Fensters.

Zeitstempel

Zeitstempel werden immer im Dateisystem gespeichert, sodass Sie durch die Zeitverfolgung eingeschränkt sind (EXT3, EXT4, XFS usw.).

Dateisysteme

Wenn Sie jemals neugierig sind, werfen Sie einen Blick auf dieses Wikipedia-Thema mit dem Titel: Vergleich von Dateisystemen . Es enthält die umfangreichste Liste der mir bekannten Dateisysteme sowie eine Tabelle mit den verschiedenen Funktionen und dem Status, ob sie in einem bestimmten Dateisystem unterstützt werden oder nicht.

Verweise

slm
quelle
Danke für das Update, das hilft. Eigentlich lese ich hier, dass ext4 Erstellungsdaten behalten kann, aber dies wurde noch nicht im Kernel implementiert.
Terdon
@terdon - ja, es macht Sinn, dass einige Dateisysteme dies unterstützen würden. Es scheint mir längst überfällig, ich verstehe in der Vergangenheit, warum es weggelassen wurde, aber alles ist von Anfang an so weit fortgeschritten, dass es keinen Sinn macht, dies ausdrücklich nicht zu haben. Sie können auch die Unterstützung für die Zugriffszeit deaktivieren, sodass sie auf ähnliche Weise implementiert und dann deaktiviert werden kann, wenn Sie dies wirklich nicht wollten.
slm
18

OSX verfolgt die Dateierstellung, die meisten anderen Unices jedoch nicht. Daher kann die seit der Dateierstellung verstrichene Zeit nicht ermittelt werden. Sie können die seit der letzten Änderung verstrichene Zeit auf nahezu jedem Betriebssystem abrufen.

Es gibt kein tragbares Shell-Dienstprogramm, mit lsdem die Änderungszeit einer Datei abgerufen werden kann, es sei denn, die Ausgabe ist nahezu unmöglich zu analysieren. Unter Linux gibt der folgende Befehl das Alter einer Datei aus:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

Unter Linux können Sie stat -c %Y -- "$filename"als Synonym verwenden date +%s -r "$filename".

OSX dateund statBefehle sind unterschiedlich. Sie können den folgenden Befehl verwenden:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Auf nicht eingebetteten Linux-Systemen und OSX ist Perl standardmäßig installiert.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Gilles 'SO - hör auf böse zu sein'
quelle
Kommt es auf das Betriebssystem oder das Dateisystem an? Diese Fragen und Antworten scheinen zu implizieren, dass das Dateisystem sie beibehält, der Kernel jedoch eine Methode für den Zugriff auf sie bereitstellen muss.
Terdon
@terdon - siehe meine Updates.
SLM
@terdon Beide. Die Fragen und Antworten, die Sie verknüpfen, sind korrekt. Aktuelle Dateisysteme verfolgen bereits seit einiger Zeit die Erstellungszeit. In FreeBSD kann man das tatsächlich statausmachen, in Linux wurde der Syscall nicht überarbeitet, so dass man auf Hacking zurückgreifen muss debugfs.
Wingedsubmariner
1
@wingedsubmariner Mit dem Vorbehalt, dass die Erstellungszeit im Dateisystem häufig nicht das Erstellungsdatum in der Anwendung ist, verwenden viele Anwendungen die Methode create-new-then-move, um eine neue Version zu speichern, anstatt sie vor Ort zu überschreiben.
Gilles 'SO - hör auf böse zu sein'
4

Basierend auf der Antwort von Gilles ist hier eine Bash-Funktion, die das Alter der Datei in Sekunden oder nach einem Fehler zurückgibt.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}
Nicholas Sushkin
quelle
1
Ordentliche Funktion, leicht anzupassen durch Hinzufügen einer einfachen Unterteilung, um das Alter in Stunden, Tagen, Wochen zu sehen ....
Emmanuel Devaux
0

Sie können verwendet werden stat -f%B, ls -lUoder mdls -n kMDItemFSCreationDatedie Schaffung (Geburt) Zeit in OS X zu sehen:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10
Lri
quelle
0
stat -c %Y <filename>

suche man statnach -c(Format-) Optionen

Guido Rizzi
quelle