Voglio scoprire la data di creazione di un determinato file, non la data di modifica o la data di accesso.
Ho provato con ls -ltrh
e stat filename
.
stap
per recuperare i tempi di creazione.
Voglio scoprire la data di creazione di un determinato file, non la data di modifica o la data di accesso.
Ho provato con ls -ltrh
e stat filename
.
stap
per recuperare i tempi di creazione.
Risposte:
Lo standard POSIX definisce solo tre distinti timestamp da memorizzare per ciascun file: l'ora dell'ultimo accesso ai dati, l'ora dell'ultima modifica dei dati e l'ora dell'ultima modifica dello stato del file.
Detto questo, i moderni filesystem Linux, come ext4, Btrfs e JFS, memorizzano il tempo di creazione del file (ovvero il tempo di nascita), ma usano nomi diversi per il campo in questione ( crtime
in ext4, otime
in Btrfs e JFS). Tuttavia, attualmente Linux non fornisce un'API del kernel per accedere ai tempi di creazione dei file , anche sui file system che li supportano.
Come hanno sottolineato Craig Sanders e Mohsen Pahlevanzadeh , stat
supporta gli identificatori di formato %w
e %W
per la visualizzazione del tempo di nascita del file (in formato leggibile dall'uomo e in secondi, rispettivamente, da Epoch). Tuttavia, stat
accede direttamente all'ora di nascita tramite il get_stat_birthtime()
comando fornito da gnulib (in lib/stat-time.h
), che ottiene l'ora di nascita dai campi st_birthtime
e st_birthtimensec
della stat
struttura restituiti dalla stat()
chiamata di sistema. Mentre per esempio i sistemi BSD (e in estensione OS X) forniscono st_birthtime
via stat
, Linux no. Questo è il motivo per cui stat -c '%w' file
output -
(che indica un tempo di creazione sconosciuto) su Linux anche per filesystem che memorizzano internamente il tempo di creazione.
Come sottolinea Stephane Chazelas , alcuni filesystem, come ntfs-3g, espongono i tempi di creazione dei file tramite attributi di file estesi.
stap
per creare la tua API del kernel. Vedi l'esempio nella risposta qui.
TLDR; Usa stap
( "SystemTap" ) per creare la tua API del kernel. Demo dell'estrazione del tempo di creazione ext4 di seguito.
Puoi estrarre i tempi di creazione ext4 sui sistemi Fedora 19. Ecco il mio:
$ 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
È chiaro che gli inode sulle mie partizioni ext4 hanno il tempo di creazione. Ecco uno script di shell che determina l'inode associato a un nome file e quindi aumenta l' stat
output con il tempo di creazione utilizzando stap
("systemtap").
NB: Questa è solo una demo e estremamente inefficiente poiché un modulo del kernel viene creato, caricato e scaricato per ogni esecuzione. Anche questo è probabilmente molto fragile poiché non viene eseguito alcun controllo degli errori. Sarebbe preferibile un'API del kernel appropriata, ma questo script potrebbe essere reso molto più efficiente e leggere i tempi di creazione di più file / inode.
[contenuto di 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
Ecco una demo:
$ 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
consenti di ottenere crtime
senza scimmiottaggio il kernel.
In ext4
esso è possibile; perché il ext4
file system memorizza l'ora di creazione del file. Tuttavia, scoprirai che il stat
comando non è in grado di mostrare la data, perché penso che il kernel non abbia API per questo.
Ad ogni modo, il tempo di nascita del file è memorizzato ext4
e puoi scoprirlo, anche se non con un metodo diretto, ma usandodebugfs
sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime
xstat filename
/dev/sdxX
è installato /some/path
e il file lo è /some/path/some/file
, il percorso da specificare è solo some/file
: il suo percorso deve essere riferito non alla radice del filesystem, ma al mountpoint. Altrimenti, il file non verrà trovato.
In teoria, con GNU stat è possibile utilizzare stat -c '%w'
o %W
ottenere la data di creazione di un file (ovvero il tempo di nascita).
In pratica, la maggior parte dei filesystem non registra tali informazioni e il kernel Linux non fornisce alcun modo per accedervi.
Il più vicino che puoi ottenere è il ctime del file, che non è l'ora di creazione, è l'ora in cui i metadati del file sono stati modificati l'ultima volta.
Linux Weekly News ha pubblicato un articolo interessante su questo alcuni anni fa - http://lwn.net/Articles/397442/
stat --printf='%w' yourfile #human readable
stat --printf='%W' yourfile #seconds from Epoch , 0 if unknown
Differenza tra FreeBSD
e GNU\Linux
on stat command
:
Se chiami il stat
comando in GNU\Linux
esso invoca l' -x
opzione, ma in FreeBSD, tu stesso dovresti invocare l' -x
opzione.
Vedi anche Quali file system su Linux memorizzano i tempi di creazione?
Note: --printf
è molto utile in scripting
....!
In OS X è possibile utilizzare ls -lU
, stat -f%B
, GetFileInfo -d
, o 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
Controllalo:
# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1
A proposito, funziona solo su ext4. Non ho ancora trovato una soluzione per BtrFS ...);
stat(1)
.