Je souhaite connaître la date de création d'un fichier particulier, et non la date de modification ou la date d'accès.
J'ai essayé avec ls -ltrh
et stat filename
.
stap
pour récupérer les temps de création.
Je souhaite connaître la date de création d'un fichier particulier, et non la date de modification ou la date d'accès.
J'ai essayé avec ls -ltrh
et stat filename
.
stap
pour récupérer les temps de création.
Réponses:
La norme POSIX ne définit que trois horodatages distincts à stocker pour chaque fichier: 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.
Cela dit, les systèmes de fichiers Linux modernes, tels que ext4, Btrfs et JFS, enregistrent l'heure de création du fichier (heure de naissance), mais utilisent des noms différents pour le champ en question ( crtime
dans ext4, otime
dans Btrfs et JFS). Cependant, actuellement, Linux ne fournit pas d’API de noyau pour accéder aux temps de création de fichiers , même sur les systèmes de fichiers les prenant en charge.
Comme Craig Sanders et Mohsen Pahlevanzadeh ont souligné, stat
ne supporte le %w
et %W
spécificateurs de format pour afficher l'heure de naissance de fichier (en format lisible par l' homme et en quelques secondes depuis Epoch respectivement). Cependant, stat
lui - même accède à l'heure de naissance via la fonction get_stat_birthtime()
fournie par gnulib (in lib/stat-time.h
), qui obtient l'heure de naissance à partir des champs st_birthtime
et st_birthtimensec
de la stat
structure renvoyés par l' stat()
appel système. Bien que, par exemple, les systèmes BSD (et, par extension, OS X) fournissent st_birthtime
via stat
, ce n’est pas le cas de Linux. C’est pourquoi les stat -c '%w' file
sorties -
(indiquant une heure de création inconnue) sous Linux, même pour les systèmes de fichiers qui stockent l’heure de création en interne.
Comme le souligne Stéphane Chazelas , certains systèmes de fichiers, tels que ntfs-3g, exposent les temps de création de fichiers via des attributs de fichier étendus.
stap
pour créer votre propre API de noyau. Voir l'exemple en réponse ici.
TLDR; Utilisez stap
( "SystemTap" ) pour créer votre propre API de noyau. Démo de l'extraction du temps de création ext4 ci-dessous.
Vous pouvez extraire les temps de création ext4 sur les systèmes Fedora 19. Voici la mienne:
$ uname -a
Linux steelers.net 3.11.1-200.fc19.i686.PAE #1 SMP Sat Sep 14 15:20:42 UTC 2013 i686 i686 i386 GNU/Linux
Il est clair que les inodes sur mes partitions ext4 ont le temps de création. Voici un script shell qui détermine l'inode associé à un nom de fichier, puis augmente la stat
sortie avec l'heure de création en utilisant stap
("systemtap").
NB: Ceci est juste une démo et extrêmement inefficace puisqu'un module de noyau est créé, chargé et déchargé à chaque exécution. Ceci est également probablement très fragile car aucune vérification d'erreur n'est effectuée. Une API de noyau appropriée serait préférable, mais ce script pourrait être rendu beaucoup plus efficace et lire les temps de création de plusieurs fichiers / inodes.
[contenu de stap_stat.sh]
#/bin/sh
my_inode_str=$(stat --printf="%i" $1)
stap - << end_of_stap_script
global my_offsetof
probe begin {
system("stat $1");
my_offsetof = &@cast(0,"struct ext4_inode_info")->vfs_inode;
}
probe kernel.function("ext4_getattr@fs/ext4/inode.c") {
probe_inode=\$dentry->d_inode;
if (@cast(probe_inode, "struct inode")->i_ino == $my_inode_str) {
my_i_crtime = &@cast(probe_inode - my_offsetof,"struct ext4_inode_info")->i_crtime;
printf("CrTime: %s GMT\n", ctime(@cast(my_i_crtime, "timespec")->tv_sec));
printf("CrTime (nsecs): %d\n", @cast(my_i_crtime, "timespec")->tv_nsec);
exit();
}
}
end_of_stap_script
Voici une démo:
$ ll testfile
ls: cannot access testfile: No such file or directory
$ touch testfile
$ ./stap_stat.sh testfile
File: ‘testfile’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:17:04.221441084 -0400
Change: 2013-09-28 06:17:04.221441084 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ ll testfile
-rw-rw-r--. 1 Rick Rick 0 Sep 28 06:17 testfile
$ cat - >> testfile
Now is the time ...
$ ll testfile
-rw-rw-r--. 1 Rick Rick 20 Sep 28 06:18 testfile
$ ./stap_stat.sh testfile
File: ‘testfile’
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ cat testfile
Now is the time ...
$ ./stap_stat.sh testfile
File: ‘testfile’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ mv testfile testfile2
$ ./stap_stat.sh testfile2
File: ‘testfile2’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:20:45.870295668 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$
debugfs + stat
permet d'obtenir crtime
sans singe patcher le noyau.
En ext4
c'est possible; car ext4
le système de fichiers stocke l'heure de création du fichier. Néanmoins, vous constaterez que la stat
commande ne peut pas afficher la date, car je pense que le noyau ne possède aucune API pour cela.
Quoi qu’il en soit, l’heure de naissance du fichier est enregistrée ext4
et vous pouvez le trouver, mais pas par une méthode directe, mais en utilisantdebugfs
sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime
xstat filename
/dev/sdxX
est monté dans /some/path
et que le fichier est /some/path/some/file
, le chemin à spécifier est uniquement some/file
: son chemin doit être référé non à la racine du système de fichiers, mais au point de montage. Sinon, le fichier ne sera pas trouvé.
En théorie, avec GNU stat, vous pouvez utiliser stat -c '%w'
ou %W
obtenir la date de création d'un fichier (ou heure de naissance).
En pratique, la plupart des systèmes de fichiers n'enregistrent pas ces informations et le noyau Linux ne fournit aucun moyen d'y accéder.
Le plus proche que vous pouvez obtenir est ctime du fichier, qui n'est pas l'heure de création, mais l'heure à laquelle les métadonnées du fichier ont été modifiées.
Linux Weekly News a publié un article intéressant à ce sujet il y a quelques années - http://lwn.net/Articles/397442/
stat --printf='%w' yourfile #human readable
stat --printf='%W' yourfile #seconds from Epoch , 0 if unknown
Différence entre FreeBSD
et GNU\Linux
sur stat command
:
Si vous appelez stat
commande, GNU\Linux
elle appelle l' -x
option, mais sous FreeBSD, vous devez invoquer vous-même l' -x
option.
Voir aussi Quels systèmes de fichiers sous Linux stockent l'heure de création?
Notes: --printf
est très utile en scripting
....!
Dans OS X , vous pouvez utiliser ls -lU
, stat -f%B
, GetFileInfo -d
ou mdls -n kMDItemFSCreationDate
:
$ ls -lU
total 0
-rw-r--r-- 1 lauri staff 0 Apr 25 03:58 a
$ stat -f%B a
1398387538
$ stat -f%SB -t %Y%m%d%H%M a
201404250358
$ GetFileInfo -d a
04/25/2014 03:58:58
$ mdls -n kMDItemFSCreationDate a
kMDItemFSCreationDate = 2014-04-25 00:58:58 +0000
Regarde ça:
# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1
BTW, cela ne fonctionne que sur ext4. Je n'ai pas encore trouvé de solution pour BtrFS ...;)
stat(1)
.