Come trovare la data di creazione del file?


104

Voglio scoprire la data di creazione di un determinato file, non la data di modifica o la data di accesso.

Ho provato con ls -ltrhe stat filename.


5
Linux non tiene traccia del tempo di creazione poiché non è richiesto da POSIX. Tuttavia, Mac OS X funziona con il filesystem HFS - guarda in "tempo di nascita" in stat(1).
200_successo

2
I filesystem Fedora 19 ext4 impostano i tempi di creazione dei file. Sono sicuro che ci sono molti altri esempi. Vedi la risposta che segue che utilizza stapper recuperare i tempi di creazione.
rickhg12hs

Risposte:


88

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 ( crtimein ext4, otimein 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 , statsupporta gli identificatori di formato %we %Wper la visualizzazione del tempo di nascita del file (in formato leggibile dall'uomo e in secondi, rispettivamente, da Epoch). Tuttavia, stataccede 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_birthtimee st_birthtimensecdella statstruttura restituiti dalla stat()chiamata di sistema. Mentre per esempio i sistemi BSD (e in estensione OS X) forniscono st_birthtimevia stat, Linux no. Questo è il motivo per cui stat -c '%w' fileoutput -(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.


4
Su Linux, ora è archiviato in molti filesystem incluso ext4. Non ci sono ancora API del kernel per ottenerlo. Alcuni file system come ntfs-3g over fuse lo rendono disponibile tramite l'API dell'attributo esteso
Stéphane Chazelas,

@StephaneChazelas Grazie per i tuoi commenti. Aggiornata la risposta per fornire maggiori dettagli.
Thomas Nyman,

Puoi usare stapper creare la tua API del kernel. Vedi l'esempio nella risposta qui.
rickhg12hs

26

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

4
Ok, è fantastico. +1 per l'utilizzo di stap, scimmia patching del kernel linux, fantastico.
Chris Magnuson,

@ChrisMagnuson: debugfs + statconsenti di ottenere crtimesenza scimmiottaggio il kernel.
jfs,

17

In ext4esso è possibile; perché il ext4file system memorizza l'ora di creazione del file. Tuttavia, scoprirai che il statcomando 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 ext4e puoi scoprirlo, anche se non con un metodo diretto, ma usandodebugfs

sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime


1
come funzione bash:xstat filename
jfs,

1
Se /dev/sdxXè installato /some/pathe 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.
BowPark,

15

In teoria, con GNU stat è possibile utilizzare stat -c '%w'o %Wottenere 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/


7
stat --printf='%w' yourfile   #human readable

stat --printf='%W' yourfile   #seconds from Epoch , 0 if unknown

Differenza tra FreeBSDe GNU\Linuxon stat command:

Se chiami il statcomando in GNU\Linuxesso invoca l' -x opzione, ma in FreeBSD, tu stesso dovresti invocare l' -xopzione.

Vedi anche Quali file system su Linux memorizzano i tempi di creazione?

Note: --printf è molto utile in scripting....!


//, ho provato questo su una macchina CEntOS 6, e tutto ciò che ho ottenuto sono stati punti interrogativi: $ stat --printf = '% w' ~ / dump.rdb? Forse il mio file system non supporta stat con% w.
Nathan Basanese,

sfortunatamente, HFS non supporta ctime.
Golfo Persico,

5

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

2

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 ...);


1
È praticamente quello che dice la risposta di Beginer ... non è vero?
don_crissti,

spiacenti, hai ragione @don_crissti
Renich il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.