web-dev-qa-db-fra.com

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

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

61
NoodleFolk

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, telles que définies par le standard POSIX (voir Section Définitions de la base 4.8 Mise à jour des temps de fichier )

Chaque fichier a trois horodatages associés distincts: l'heure du dernier accès aux données, l'heure de la dernière modification des données et l'heure de la dernière modification du statut du fichier. Ces valeurs sont renvoyées dans la structure de caractéristiques du fichier , struct stat , comme décrit dans la section <sys/stat.h> .

EDIT: Comme mentionné dans les commentaires ci-dessous, selon le système de fichiers utilisé, les métadonnées peuvent contenir une date de création de fichier. Notez cependant que le stockage d'informations de ce type n'est pas standard. En fonction de cela, des problèmes de portabilité peuvent survenir lors du transfert vers un autre système de fichiers, au cas où celui-ci serait effectivement utilisé.

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
[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
35
user2725883

la réponse de Mikyra est bonne.Le fait, tout 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 quel fichier a été créé en premier, vous pouvez structurer votre nom de fichier en ajoutant la date système lorsque vous créez une série de fichiers.

15
jason

Notez que si votre système de fichiers est monté avec noatime pour des raisons de performances, il affichera probablement l'heure de création. Étant donné que noatime entraîne une amélioration considérable des performances (en supprimant une écriture sur disque à chaque lecture d'un fichier), il peut s'agir d'une option de configuration judicieuse qui vous donne également les résultats souhaités.

14
unit3

ls -i menus.xml

94490 menus.xml Ici le nombre 94490 représente l'inode

Alors fais un:

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 le fichier menus.xml se trouve sur "/", c'est-à-dire "/ dev/mapper/vg-root".

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

La sortie peut ressembler à 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\000" (31)
BLOCKS:
(0-1):375818-375819
TOTAL: 2

Où vous pouvez voir le moment de la création:

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

La date/heure de création est normalement non enregistrée. Donc non, vous ne pouvez pas.

5
user80168

Vous pouvez trouver le moment de la création - c'est-à-dire l'heure de la naissance - en utilisant stat et également en utilisant find.
Nous avons ces fichiers avec 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 laps de temps donné, utilisez find 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 pages de manuel explique% w:

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

Comme @mikyra l'a expliqué, l'heure de la création n'est pas stockée nulle part.

Toutes les méthodes ci-dessus sont agréables, mais si vous souhaitez obtenir rapidement la date de dernière modification, vous pouvez taper:

ls -lit /path

avec l’option - t vous listez tous les fichiers dans/chemin indiqué par la date de dernière modification.

1
Luca Davanzo

Si vous voulez vraiment y parvenir, vous pouvez utiliser un observateur de fichiers tel que inotifywait .

Vous regardez un répertoire et vous enregistrez les informations sur les créations de fichiers dans des fichiers séparés 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 aucune heure de création n'est stockée, vous pouvez construire votre propre système basé sur inotify.

1
william.eyidi

encore mieux:

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

Mer 20 juil 19:25:48 2016

0
Zibri

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 $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

Une autre astuce à ajouter à votre arsenal est la suivante:

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

En règle générale, si l’on modifie un fichier, il doit réclamer un crédit dans la section “Copyright”. Examinez les résultats pour connaître les dates, les noms de fichier, les contributeurs et les adresses électroniques des contacts.

exemple résultat grep:

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