2013-02-12 6 views
47

Sto usando Bash su Debian GNU/Linux 6.0. È possibile ottenere la data/ora di creazione del file? Non la data/ora di modifica. ls -lh a.txt e stat -c %y a.txt forniscono entrambi il tempo di modifica.Come ottenere la data/ora di creazione del file in Bash/Debian?

+4

Si sta utilizzando un filesystem che registra il tempo di creazione? La maggior parte non lo fa. –

+0

Vedere http://askubuntu.com/questions/470134/how-to-find-the-creation-time-of-a-file –

risposta

63

Purtroppo la vostra ricerca non sarà possibile, in generale, in quanto ci sono solo 3 valori di tempo distinti memorizzati per ciascuno dei vostri file, come definito dallo standard POSIX (vedi Base Definitions section 4.8 File Times Update)

Ogni file ha tre distinti timestamp associati: l'ora dell'ultimo accesso ai dati , l'ora dell'ultima modifica dei dati e l'ora in cui è stato modificato lo stato del file . Questi valori vengono restituiti nel file struttura delle caratteristiche struct stat, come descritto in <sys/stat.h>.

MODIFICA: come indicato nei commenti seguenti, a seconda del filesystem utilizzato i metadati possono contenere la data di creazione del file. Si noti tuttavia che la memorizzazione di informazioni del genere non è standard. A seconda di ciò può portare a problemi di portabilità che si spostano su un altro file system, nel caso in cui quello effettivamente utilizzato lo memorizzi comunque.

+1

grazie per il riferimento. – NoodleFolk

+0

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html –

+5

Tali tristi notizie. Sarebbe così utile adesso determinare con facilità se un file è stato cancellato e ricreato o se è stato lì da sempre. – froggythefrog

5

La data/ora di creazione è normalmente non memorizzata. Quindi no, non puoi.

12

Si noti che se il proprio filesystem è stato montato senza tempo per motivi di prestazioni, allora probabilmente atime mostrerà il tempo di creazione. Dato che il noatime si traduce in un massiccio incremento delle prestazioni (rimuovendo una scrittura del disco per ogni volta che viene letto un file), può essere un'opzione di configurazione ragionevole che ti dà anche i risultati che desideri.

+0

Non posso garantire l'aumento delle prestazioni, ma ho letto una guida per SSD che raccomandava noatime, quindi questo ha funzionato per me. – jake

13

La risposta di mikyra è buona. Il fatto proprio come ha detto.

[[email protected] 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 

se si desidera verificare il file wich è stato creato, è possibile strutturare il nome del file accodando data di sistema quando si crea una serie di file.

+6

Quando faccio stat myfile.txt, ottengo un'altra riga: Birth. Sfortunatamente, non ha valore. Perché quella fila è lì? – allyourcode

4

ls menus.xml -i

94490 menus.xml Qui il numero 94490 rappresenta inode

poi fare 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 

Per trovare il punto di montaggio del root "/" filesystem, perché i menu dei file.XML è '/' pari '/ dev/mapper/vg-radice'

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

L'uscita può essere come quella di seguito:

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 

dove si può vedere l'ora di creazione:

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

ctime non è il tempo di creazione, è il "momento dell'ultima modifica delle informazioni sullo stato del file" – mokalan

+2

ctime = "cambio orario" dove modifica indica la modifica di proprietario, gruppo, privilegi o qualche altro attributo. Non è necessariamente il momento della creazione. – ingyhere

+0

è crtime e non ctime .. ma grazie! – Zibri

31
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 
[[email protected] ~]# 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 
+1

qual è il significato di ctime, atime e mtime? –

+1

@Velthune Tempo di creazione, tempo di accesso, tempo di modifica. Tuttavia, a seconda del modo in cui il filesystem è configurato, questi valori possono essere o meno accurati. Ad esempio, molte persone disabilitano la scrittura dell'ultimo tempo di accesso ai file per salvare le scritture su disco extra. – indivisible

+11

@indivisible: FALSE! Gli standard POSIX definiscono ctime come tempo di cambio. Questo è quando alcuni attributi di file cambiano, generalmente. – ingyhere

1

Come spiegato @mikyra, l'ora della data di creazione non viene memorizzata da nessuna parte.

Tutti i metodi di cui sopra sono bello, ma se si vuole ottenere rapidamente solo lo scorso modificare la data, è possibile digitare:

ls -lit /path 

con -t opzione di elencare tutti i file in/percorso odered da ultimo modifica la data

1

Se si desidera ottenere ciò è possibile utilizzare un visualizzatore di file come inotifywait.

Si guarda una directory e si salvano le informazioni sulle creazioni di file in un file separato all'esterno di tale directory.

while true; do 
    change=$(inotifywait -e close_write,moved_to,create .) 
    change=${change#./ * } 
    if [ "$change" = ".*" ]; then ./scriptToStoreInfoAboutFile; fi 
done 

Poiché non viene memorizzato alcun tempo di creazione, è possibile creare il proprio sistema basato su inotify.

1

È possibile trovare il tempo di creazione - aka ora di nascita - utilizzando stat e anche abbinare con trovare.
Abbiamo questi file che mostra l'ora dell'ultima modifica:

$ 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 

Per trovare i file creati entro un determinato periodo di tempo utilizzando trovare come di seguito.
Chiaramente, il filesystem conosce la data di nascita di un file:

$ 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 


possiamo confermare questo utilizzando 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 pagine man spiega% w:

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

citato da https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347, il seguente lei llscript avrebbe lavorato per ottenere il tempo di creazione:

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

ancora meglio:

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 lug 20 19:25:48 2016