Comment obtenir la date/heure de création de fichier dans Bash/Debian?

J'utilise Bash sur Debian GNU/Linux 6.0. Est-il possible d'obtenir la date/heure de création du fichier? Pas la modification de la date/heure. ls -lh a.txt et stat -c %y a.txt ne donnent que le temps de modification.

53
demandé sur NoodleFolk 2013-02-13 01:30:26

11 réponses

malheureusement votre quête ne sera pas possible en général, car il n'y a que 3 valeurs de temps distinctes stockées pour chacun de vos fichiers tels que définis par la norme POSIX (voir définitions de Base section 4.8 mise à jour des temps de fichier )

chaque fichier a trois timestamps associés distincts: le temps de la dernière l'accès aux données, l'Heure de la dernière modification des données et l'heure du fichier dernier changement de statut. Ces valeurs sont retournées dans le fichier caractéristiques de la structure struct stat , comme décrit dans .

modifier: comme indiqué dans les commentaires ci-dessous, en fonction du système de fichiers utilisé, les métadonnées peuvent contenir la date de création du fichier. Notez cependant que le stockage de telles informations n'est pas standard. Selon elle peut conduire à des problèmes de portabilité à passer à un autre système de fichiers, dans le cas où celui réellement utilisé stocke de toute façon.

67
répondu mikyra 2015-09-13 21:43:39
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
31
répondu user2725883 2013-11-17 10:35:56

la réponse de mikyra est bonne.Le fait est comme ce qu'il a dit.

[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

si vous voulez vérifier que le fichier a été créé en premier,vous pouvez structurer votre nom de fichier en ajoutant la date du système lorsque vous créez une série de fichiers.

14
répondu jason 2013-03-14 09:10:08

notez que si vous avez votre système de fichiers monté avec noatime pour des raisons de performance, alors l'atime affichera probablement l'Heure de création. Étant donné que noatime donne un coup de pouce massif aux performances (en supprimant une écriture de disque pour chaque fois qu'un fichier est lu), il peut être une option de configuration raisonnable qui vous donne également les résultats que vous voulez.

13
répondu unit3 2013-03-14 04:36:27

Date/Heure de création est normalement pas stocké. Donc non, tu ne peux pas.

5
répondu 2013-02-12 21:34:57

LS-I menus.xml

94490 menus.XML Ici le numéro 94490 représente inode

Puis:

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

pour trouver le point de montage du système de fichiers racine"/", car les menus de fichier.xml est sur '/' c'est-à-dire '/dev/mapper / vg-root '

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

la sortie peut être comme celle ci-dessous:

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"151910920"0" (31)
BLOCKS:
(0-1):375818-375819
TOTAL: 2

où vous pouvez voir le temps de création:

ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
4
répondu GustavoH 2013-10-22 22:30:27

vous pouvez trouver le temps de création - alias le temps de naissance - en utilisant stat et aussi correspondre en utilisant trouver .

nous avons ces fichiers montrant l'Heure de la dernière modification:

$ 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

pour trouver des fichiers créés dans un certain délai en utilisant pour trouver comme ci-dessous.

de toute évidence, le système de fichiers connaît l'Heure de naissance d'un fichier:

$ 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



nous pouvons le confirmer en utilisant stat:

$ 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 explains %w:

%w     time of file birth, human-readable; - if unknown
2
répondu zanfilip 2015-05-07 18:31:23

comme @mikyra l'a expliqué, la date de création n'est stockée nulle part.

toutes les méthodes ci-dessus sont jolies, mais si vous voulez obtenir rapidement la date de dernière modification, vous pouvez taper:

ls -lit /path

avec l'option - t vous énumérez tous les fichiers dans /path odered par dernière date de modification.

1
répondu Luca Davanzo 2014-02-21 15:41:59

si vous voulez vraiment atteindre que vous pouvez utiliser un observateur de fichier comme inotifywait .

vous regardez un répertoire et vous enregistrez des informations sur les créations de fichiers dans un fichier séparé en dehors de ce répertoire.

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

comme aucun temps de création n'est stocké, vous pouvez construire votre propre système basé sur inotify.

1
répondu william.eyidi 2015-02-26 16:56:21

Cité de https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347 , le shellscript suivant fonctionnerait pour obtenir le temps de création:

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

encore mieux:

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

lsct /etc

Wed Jul 20 19:25: 48 2016

0
répondu Zibri 2016-12-23 11:16:17