88 votes

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

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

5voto

GustavoH Points 112

Ls -i menus.xml

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

Alors faites 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 "/", parce que le fichier menus.xml est 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 temps de création :

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

5voto

zanfilip Points 21

Vous pouvez trouver l'heure de création - c'est-à-dire l'heure de naissance - en utilisant les éléments suivants stat et aussi des correspondances en utilisant trouver .
Nous avons ces fichiers qui montrent 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 les fichiers créés au cours d'une période donnée en utilisant trouver comme ci-dessous.
Il est clair que 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 les statistiques :

$ 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 Les pages de manuel expliquent %w :

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

2voto

Velthune Points 3019

Comme l'a expliqué @mikyra, la date et l'heure de création ne sont stockées nulle part.

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

ls -lit /path

avec -t permet de lister tous les fichiers dans /path classés par date de dernière modification.

1voto

Si vous voulez vraiment y arriver, vous pouvez utiliser un observateur de fichiers comme inotifywait .

Vous surveillez un répertoire et vous enregistrez les 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 aucune heure de création n'est enregistrée, vous pouvez construire votre propre système basé sur inotify.

1voto

Mike Chen Points 131

Cité dans https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347 le script shell suivant fonctionnerait pour obtenir l'heure 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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X