2013-02-12 7 views
47

Ich benutze Bash unter Debian GNU/Linux 6.0. Ist es möglich, das Datum/die Uhrzeit der Dateierstellung zu erhalten? Nicht das Änderungsdatum. ls -lh a.txt und stat -c %y a.txt geben beide nur die Modifikationszeit an.Wie erhalte ich Dateierstellungsdatum/-uhrzeit in Bash/Debian?

+4

Sie ein Dateisystem verwenden, die Erstellungszeit der Datensätze? Die meisten nicht. –

+0

Siehe http://askubuntu.com/questions/470134/how-to-find-the-creation-time-of-a-file –

Antwort

63

Leider wird Ihre Suche in der Regel möglich sein, da es nur 3 verschiedene Zeitwerte für jede Ihrer Dateien gespeichert sind, wie durch den POSIX-Standard (siehe Base Definitions section 4.8 File Times Update)

definiert

Jede Datei hat drei verschiedene zugehörige Zeitstempel: die Zeit des letzten Datenzugriffs, der Zeitpunkt der letzten Datenänderung und die Zeit, zu der sich die Datei zuletzt geändert hat. Diese Werte werden in der Datei Merkmalsstruktur Strukturstatus zurückgegeben, wie in <sys/stat.h> beschrieben.

BEARBEITEN: Wie in den Kommentaren unten erwähnt, können Metadaten je nach verwendetem Dateisystem Dateierstellungsdatum enthalten. Beachten Sie jedoch, dass das Speichern von Informationen nicht standardmäßig ist. Abhängig davon kann es zu Portabilitätsproblemen kommen, die in ein anderes Dateisystem verschoben werden, falls das tatsächlich verwendete irgendwie irgendwie speichert.

+1

danke für die referenz. – NoodleFolk

+0

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html –

+5

Solche traurige Nachrichten. Es wäre jetzt so nützlich, einfach zu bestimmen, ob eine Datei gelöscht und neu erstellt wurde oder schon die ganze Zeit da war. – froggythefrog

5

Erstellungsdatum/-uhrzeit ist normalerweise nicht gespeichert. Also nein, das kannst du nicht.

12

Beachten Sie, dass wenn Sie Ihr Dateisystem aus Leistungsgründen mit Notime eingehängt haben, dann zeigt der Atime wahrscheinlich die Erstellungszeit. Angesichts der Tatsache, dass Noatime zu einem massiven Leistungsschub führt (durch Entfernen einer Festplattenschreiboperation für jedes Mal, wenn eine Datei gelesen wird), kann es eine sinnvolle Konfigurationsoption sein, die auch die gewünschten Ergebnisse liefert.

+0

Ich kann nicht für den Leistungsschub bürgen, aber ich lese eine Anleitung für SSDs, die Noatime empfohlen, so dass dies für mich funktionierte. – jake

13

mikyras Antwort ist gut.Die Tatsache genau wie was er sagte.

[[email protected] 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 wollen Wich-Datei erstellt wurde zuerst überprüfen, können Sie Ihre Dateinamen Datum durch Anhängen System strukturieren, wenn Sie eine Reihe von Dateien erstellen.

+6

Wenn ich Stat Myfile.txt mache, bekomme ich eine andere Zeile: Geburt. Leider hat es keinen Wert. Warum ist diese Reihe da? – allyourcode

4

ls -i menus.xml

94490 menus.xml Hier wird die Anzahl 94.490 repräsentiert inode

tun dann 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 

das finden Montagepunkt des Root "/" Dateisystem, weil die Datei Menüs.XML ist auf '/', die '/ dev/Mapper/vg-root'

debugfs -R 'stat < 94.490>'/dev/Mapper/vg-root

die Ausgabe wie derjenige sein kann, unten:

debugfs -R 'stat < 94.490>'/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 
+13

ctime ist nicht die Erstellungszeit, es ist die "Zeit der letzten Änderung der Datei Statusinformationen" – mokalan

+2

ctime = "Zeit ändern", wo Änderung bedeutet Änderung der Besitzer, Gruppe, Privilegien oder ein anderes Attribut. Es ist nicht unbedingt die Erstellungszeit. – ingyhere

+0

es ist ctime und nicht ctime .. aber danke! – Zibri

31
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 
[[email protected] ~]# 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 
+1

Was bedeutet ctime, atime und mtime? –

+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 nicht. Zum Beispiel deaktivieren viele Leute das Schreiben der letzten Zugriffszeit auf Dateien, um auf den zusätzlichen Plattenschreibvorgängen zu sparen. – indivisible

+11

@indivisible: FALSCH! POSIX-Standards definieren ctime als Änderungszeitpunkt. Dies ist der Fall, wenn sich einige Dateiattribute ändern. – ingyhere

1

Wie @mikyra erklärt, wird die Erstellungsdatumszeit nirgendwo gespeichert.

Alle oben genannten Methoden sind schön, aber wenn man schnell nur letzte Änderungsdatum erhalten möchten, können Sie Folgendes eingeben:

ls -lit /path 

mit -t Option listen Sie alle Dateien in/Pfad von im letzten odered Datum ändern

1

Wenn Sie das wirklich erreichen möchten, können Sie einen Dateiwatcher wie inotifywait verwenden.

Sie überwachen ein Verzeichnis und speichern Informationen über Dateierstellung 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.

1

können Sie die Erstellungszeit finden - auch bekannt als Geburtszeit - mit stat und passen auch finden Verwendung.
Wir haben diese Dateien Letzte Änderung der Zeit zeigt:

$ 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 

Dateien innerhalb eines bestimmten Zeitrahmens erstellt Um als unten verwenden.
ist klar, das Dateisystem kennt 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 Mann Seiten erklärt% w:

%w  time of file birth, human-readable; - if unknown 
0

Zitiert von https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347, die folgende sie llscript funktionieren würde, Erstellungszeit 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 
} 
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

Mitt Jul 20 19:25:48 2016