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?
risposta
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.
grazie per il riferimento. – NoodleFolk
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html –
Tali tristi notizie. Sarebbe così utile adesso determinare con facilità se un file è stato cancellato e ricreato o se è stato lì da sempre. – froggythefrog
La data/ora di creazione è normalmente non memorizzata. Quindi no, non puoi.
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.
Non posso garantire l'aumento delle prestazioni, ma ho letto una guida per SSD che raccomandava noatime, quindi questo ha funzionato per me. – jake
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.
Quando faccio stat myfile.txt, ottengo un'altra riga: Birth. Sfortunatamente, non ha valore. Perché quella fila è lì? – allyourcode
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
ctime non è il tempo di creazione, è il "momento dell'ultima modifica delle informazioni sullo stato del file" – mokalan
ctime = "cambio orario" dove modifica indica la modifica di proprietario, gruppo, privilegi o qualche altro attributo. Non è necessariamente il momento della creazione. – ingyhere
è crtime e non ctime .. ma grazie! – Zibri
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
qual è il significato di ctime, atime e mtime? –
@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
@indivisible: FALSE! Gli standard POSIX definiscono ctime come tempo di cambio. Questo è quando alcuni attributi di file cambiano, generalmente. – ingyhere
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
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.
È 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
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
}
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
Si sta utilizzando un filesystem che registra il tempo di creazione? La maggior parte non lo fa. –
Vedere http://askubuntu.com/questions/470134/how-to-find-the-creation-time-of-a-file –