Wie erhalte ich das Datum und die Uhrzeit der Dateierstellung in Bash / Debian?

74

Ich verwende Bash unter Debian GNU / Linux 6.0. Ist es möglich, das Datum / die Uhrzeit der Dateierstellung abzurufen? Nicht das Änderungsdatum / die Änderungszeit. ls -lh a.txtund stat -c %y a.txtbeide geben nur die Änderungszeit an.

NoodFolk
quelle
5
Verwenden Sie ein Dateisystem, das die Erstellungszeit aufzeichnet? Die meisten nicht.
William Pursell

Antworten:

85

Leider ist Ihre Suche im Allgemeinen nicht möglich, da für jede Ihrer Dateien nur 3 unterschiedliche Zeitwerte gespeichert sind, wie im POSIX-Standard definiert (siehe Basisdefinitionen, Abschnitt 4.8, Aktualisierung der Dateizeiten ).

Jeder Datei sind drei unterschiedliche Zeitstempel zugeordnet: der Zeitpunkt des letzten Datenzugriffs, der Zeitpunkt der letzten Datenänderung und der Zeitpunkt, zu dem sich der Dateistatus zuletzt geändert hat. Diese Werte werden in der Strukturstruktur stat der Dateieigenschaften zurückgegeben , wie in <sys / stat.h> beschrieben .

BEARBEITEN: Wie in den Kommentaren unten erwähnt, können Metadaten je nach verwendetem Dateisystem das Erstellungsdatum der Datei enthalten. Beachten Sie jedoch, dass die Speicherung solcher Informationen nicht Standard ist. Abhängig davon kann es zu Portabilitätsproblemen beim Wechsel in ein anderes Dateisystem kommen, falls das tatsächlich verwendete es irgendwie speichert.

Mikyra
quelle
7
Solche traurigen Nachrichten. Es wäre jetzt sehr nützlich, einfach festzustellen, ob eine Datei gelöscht und neu erstellt wurde oder die ganze Zeit dort war.
Froggythefrog
Wissen Sie, wie das auf einem Mac funktioniert? Der Finder zeigt drei Zeitstempel als "Erstellt", "Geändert", "Letztes Öffnen" ...
johk95
Stark abhängig vom verwendeten Dateisystem. Aber trotzdem ein guter Punkt. :) Versucht, die fehlenden Informationen zum Beitrag hinzuzufügen.
Mikyra
41
ls -i file #output is for me 68551981
debugfs -R 'stat <68551981>' /dev/sda3 # /dev/sda3 is the disk on which the file exists

#results - crtime value
[root@loft9156 ~]# debugfs -R 'stat <68551981>' /dev/sda3
debugfs 1.41.12 (17-May-2010)
Inode: 68551981   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 769802755    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 38973440
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 76128
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013
 atime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013
 mtime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013
**crtime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013**
Size of extra inode fields: 28
EXTENTS:
(0-511): 352633728-352634239, (512-1023): 352634368-352634879, (1024-2047): 288392192-288393215, (2048-4095): 355803136-355805183, (4096-6143): 357941248-357943295, (6144
-9514): 357961728-357965098
user2725883
quelle
3
Was bedeutet ctime, atime und mtime?
Luca Davanzo
1
@ Velthune Erstellungszeit, Zugriffszeit, Änderungszeit. Abhängig von der Art und Weise, wie das Dateisystem konfiguriert ist, können diese Werte jedoch korrekt sein oder auch nicht. Beispielsweise deaktivieren viele Benutzer das Schreiben der letzten Zugriffszeit auf Dateien, um auf den zusätzlichen Schreibvorgängen auf der Festplatte zu speichern.
unteilbar
16
@indivisible: FALSE! POSIX-Standards definieren ctime als Änderungszeit. In diesem Fall ändern sich im Allgemeinen einige Dateiattribute.
Ingyhere
Ich kenne die Standards nicht, aber die Zeit hier ist nach dem Zeitpunkt. Ich würde annehmen, dass die Erstellungszeit die älteste sein sollte ...
Bartgol
Was ist der Unterschied zwischen Änderungszeit und Änderungszeit?
RonJohn
22

Mikyras Antwort ist gut. Die Tatsache genau wie das, was er gesagt hat.

[jason@rh5 test]$ stat test.txt
  File: `test.txt'
  Size: 0               Blocks: 8          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 588720      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  500/   jason)   Gid: (  500/   jason)
Access: 2013-03-14 01:58:12.000000000 -0700
Modify: 2013-03-14 01:58:12.000000000 -0700
Change: 2013-03-14 01:58:12.000000000 -0700

Wenn Sie überprüfen möchten, welche Datei zuerst erstellt wurde, können Sie Ihren Dateinamen strukturieren, indem Sie beim Erstellen einer Reihe von Dateien das Systemdatum anhängen.

Jason
quelle
8
Wenn ich stat myfile.txt mache, bekomme ich eine weitere Zeile: Birth. Leider hat es keinen Wert. Warum ist diese Reihe dort?
Allyourcode
14

Beachten Sie, dass, wenn Sie Ihr Dateisystem aus Leistungsgründen mit noatime gemountet haben, der atime wahrscheinlich die Erstellungszeit anzeigt. Angesichts der Tatsache, dass noatime zu einer massiven Leistungssteigerung führt (indem bei jedem Lesen einer Datei ein Schreibvorgang entfernt wird), ist dies möglicherweise eine sinnvolle Konfigurationsoption, mit der Sie auch die gewünschten Ergebnisse erzielen.

Einheit 3
quelle
Ich kann nicht für die Leistungssteigerung bürgen, aber ich habe eine Anleitung für SSDs gelesen, die Noatime empfohlen hat, also hat dies für mich funktioniert.
Jake
6

Erstellungsdatum / -zeit wird normalerweise nicht gespeichert. Also nein, das kannst du nicht.


quelle
5

ls -i menus.xml

94490 menus.xml Hier steht die Nummer 94490 für Inode

Dann mache ein:

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg-root   4.0G  3.4G  408M  90% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/sda1             124M   27M   92M  23% /boot
/dev/mapper/vg-var    7.9G  1.1G  6.5G  15% /var

So finden Sie den Einhängepunkt des Root-Dateisystems "/", da sich die Datei menus.xml auf '/' befindet, dh '/ dev / mapper / vg-root'

debugfs -R 'stat <94490>' / dev / mapper / vg-root

Die Ausgabe kann wie folgt aussehen:

debugfs -R 'stat <94490>' / dev / mapper / vg-root

debugfs 1.41.12 (17-May-2010)
Inode: 94490   Type: regular    Mode:  0644   Flags: 0x0
Generation: 2826123170    Version: 0x00000000
User:     0   Group:     0   Size: 4441
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 16
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
atime: 0x5266e47b -- Wed Oct 23 09:47:55 2013
mtime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
Size of extra inode fields: 4
Extended attributes stored in inode body: 
  selinux = "unconfined_u:object_r:usr_t:s0\000" (31)
BLOCKS:
(0-1):375818-375819
TOTAL: 2

Wo Sie die Erstellungszeit sehen können:

ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
GustavoH
quelle
16
ctime ist nicht die Erstellungszeit, sondern die "Zeit der letzten Änderung der
Dateistatusinformationen
2
ctime = "Änderungszeit", wobei Änderung eine Änderung des Eigentümers, der Gruppe, der Berechtigungen oder eines anderen Attributs bedeutet. Es ist nicht unbedingt die Erstellungszeit.
Ingyhere
3

Sie können die Erstellungszeit - auch als Geburtszeit bezeichnet - mit stat ermitteln und mit find abgleichen .
Wir haben diese Dateien, die die letzte Änderungszeit anzeigen:

$ ls -l --time-style=long-iso | sort -k6
total 692
-rwxrwx---+ 1 XXXX XXXX 249159 2013-05-31 14:47 Getting Started.pdf
-rwxrwx---+ 1 XXXX XXXX 275799 2013-12-30 21:12 TheScienceofGettingRich.pdf
-rwxrwx---+ 1 XXXX XXXX  25600 2015-05-07 18:52 Thumbs.db
-rwxrwx---+ 1 XXXX XXXX 148051 2015-05-07 18:55 AsAManThinketh.pdf

Um Dateien zu finden, die innerhalb eines bestimmten Zeitraums erstellt wurden, verwenden Sie find wie folgt.
Das Dateisystem kennt eindeutig die Geburtszeit einer Datei:

$ find -newerBt '2014-06-13' ! -newerBt '2014-06-13 12:16:10' -ls 
20547673299906851  148 -rwxrwx---   1 XXXX XXXX   148051 May  7 18:55 ./AsAManThinketh.pdf
1407374883582246  244 -rwxrwx---   1 XXXX XXXX   249159 May 31  2013 ./Getting\ Started.pdf


Wir können dies mit stat bestätigen:

$ stat -c "%w %n" * | sort
2014-06-13 12:16:03.873778400 +0100 AsAManThinketh.pdf
2014-06-13 12:16:04.006872500 +0100 Getting Started.pdf
2014-06-13 12:16:29.607075500 +0100 TheScienceofGettingRich.pdf
2015-05-07 18:32:26.938446200 +0100 Thumbs.db


stat man pages erklärt% w:

%w     time of file birth, human-readable; - if unknown
Zanfilip
quelle
Es scheint ls -lAnzeigen Zeit
ändern
$ /usr/bin/find -newerBt '2014-06-13' /usr/bin/find: This system does not provide a way to find the birth time of a file. /usr/bin/find: invalid predicate -newerBt'`
user9074332
2

Wie @mikyra erklärte, wird die Erstellungsdatum-Zeit nirgendwo gespeichert.

Alle oben genannten Methoden sind nett, aber wenn Sie schnell nur das Datum der letzten Änderung erhalten möchten, können Sie Folgendes eingeben:

ls -lit /path

Mit der Option -t listen Sie alle Dateien in / path auf, die nach dem Datum der letzten Änderung geordnet sind.

Luca Davanzo
quelle
1

Wenn Sie dies wirklich erreichen möchten, können Sie einen Datei-Watcher wie inotifywait verwenden .

Sie sehen sich ein Verzeichnis an und speichern Informationen zu Dateierstellungen in einer separaten Datei außerhalb dieses Verzeichnisses.

while true; do
  change=$(inotifywait -e close_write,moved_to,create .)
  change=${change#./ * }
  if [ "$change" = ".*" ]; then ./scriptToStoreInfoAboutFile; fi
done

Da keine Erstellungszeit gespeichert ist, können Sie Ihr eigenes System basierend auf inotify erstellen.

william.eyidi
quelle
0

Unter /unix/50177/birth-is-empty-on-ext4/131347#131347 wird das folgende Shellscript verwendet, um die Erstellungszeit zu erhalten:

get_crtime() {
   for target in "${@}"; do
       inode=$(stat -c %i "${target}")
       fs=$(df "${target}"  | tail -1 | awk '{print $1}')
       crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | grep -oP 'crtime.*--\s*\K.*')
       printf "%s\t%s\n" "${target}" "${crtime}"
   done
}
Mike Chen
quelle
0

noch besser:

lsct () 
{ 
    debugfs -R 'stat <'`ls -i "$1" | (read a b;echo -n $a)`'>' `df "$1" | (read a; read a b; echo "$a")` 2> /dev/null | grep --color=auto crtime | ( read a b c d;
    echo $d )
}

lsct / etc.

Mi 20. Juli 19:25:48 2016

Zibri
quelle
0

Ein weiterer Trick, den Sie Ihrem Arsenal hinzufügen können, ist der folgende:

$ grep -r "Copyright" /<path-to-source-files>/src

Wenn man eine Datei ändert, sollte man im Allgemeinen eine Gutschrift im „Copyright“ beantragen. Untersuchen Sie die Ergebnisse auf Daten, Dateinamen, Mitwirkende und Kontakt-E-Mails.

Beispiel grep Ergebnis:

/<path>/src/someobject.h: * Copyright 2007-2012 <creator's name> <creator's email>(at)<some URL>>
Axoloti
quelle