it-swarm.com.de

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

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

61
NoodleFolk

Leider ist Ihre Suche im Allgemeinen nicht möglich, da für jede Ihrer Dateien nur drei 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 Dateieigenschaftsstruktur struct stat 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 kein Standard ist. Abhängig davon kann es zu Portabilitätsproblemen beim Verschieben in ein anderes Dateisystem kommen, falls das tatsächlich verwendete es irgendwie speichert.

74
mikyra
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
35
user2725883

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

[[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 überprüfen möchten, welche Datei zuerst erstellt wurde, können Sie Ihren Dateinamen so strukturieren, dass beim Erstellen einer Reihe von Dateien das Systemdatum angehängt wird.

15
jason

Beachten Sie, dass wenn Sie Ihr Dateisystem aus Performancegrü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 Schreibzugriff auf die Festplatte entfernt wird), ist dies möglicherweise eine sinnvolle Konfigurationsoption, mit der Sie auch die gewünschten Ergebnisse erzielen.

14
unit3

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 können Sie die Erstellungszeit sehen:

ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
5
GustavoH

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

5
user80168

Sie können die Erstellungszeit - auch als Geburtszeit bezeichnet - mit stat ermitteln und auch 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 Zeitrahmens erstellt wurden, verwenden Sie find wie unten.
Offensichtlich kennt das Dateisystem 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 Manpages erklären% w:

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

Wie @mikyra erklärte, wird das Erstellungsdatum und die Uhrzeit nirgendwo gespeichert.

Alle oben genannten Methoden sind Nizza, aber wenn Sie schnell nur das letzte Änderungsdatum 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 sortiert sind.

1
Luca Davanzo

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

Sie überwachen ein Verzeichnis und speichern Informationen zu Dateierzeugungen 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
william.eyidi

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

0
Zibri

Zitiert von https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347 , würde das folgende Shellscript funktionieren, 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
}
0
Mike Chen

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>>
0
Axoloti