ottenere l'età del file specificato


12

Come posso ottenere l'età di un determinato file in almeno giorni?

Sono a conoscenza di ls -lhcomandi simili. Voglio qualcosa che funzionerà in questo modo:

getfage <FILE> # prints out '12d' (12 days)

Inoltre, questo deve essere un po 'multipiattaforma poiché vorrei usarlo anche su Mac OS X, ma il caso d'uso principale è sul mio Linux-box.

NOTA

Poiché Linux non tiene traccia dei tempi di creazione, sto cercando una soluzione duplice: una per mtime (linux), ovvero l'ultima volta in cui è stato modificato il file, e una per Mac OS X, che può essere gestita da entrambi mtime o tempo di creazione.



@slm Riguarda in particolare i tempi di creazione, non calcola l'età della riga di comando.
Gilles 'SO- smetti di essere malvagio' il


@terdon, non proprio. Vedi la mia NOTA sopra.
Alexej Magura,

@AlexejMagura e in che modo le risposte nel dupe non fanno per te? statti dà tutto ciò di cui hai bisogno, giusto?
terdon

Risposte:


16

Unix non tiene traccia di una data di creazione. Le uniche informazioni disponibili sono in genere le ultime volte in cui i file sono stati:

  1. Accessed
  2. Modificata
  3. Cambiato
  • Accesso: l'ultima volta che il file è stato letto
  • Modifica: l'ultima volta che il file è stato modificato (il contenuto è stato modificato)
  • Modifica: l'ultima volta che sono stati modificati i metadati del file (ad es. Autorizzazioni)

( Da questa risposta )

Puoi ottenere le date relative a un determinato file usando il statcomando.

Esempio

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX e HFS

Se stai usando OSX, il filesystem utilizzato in quel Unix è HFS . Questo è uno dei pochi (di cui sono a conoscenza) che mantiene la data di creazione all'interno del filesystem, insieme ai tempi di modifica ecc. Simili ad altri Unix.

estratto

Un record di file memorizza una varietà di metadati relativi al file tra cui il CNID, la dimensione del file, tre timestamp (quando il file è stato creato, modificato l'ultima volta, eseguito l'ultimo backup), il primo file si estende dei fork di dati e risorse e puntatori ai primi dati del file e record di estensione delle risorse nel file di overflow di estensione. Il File Record memorizza anche due campi a 16 byte che vengono utilizzati dal Finder per memorizzare gli attributi relativi al file, inclusi elementi come il codice del creatore, il codice del tipo, la finestra in cui deve apparire il file e la sua posizione all'interno della finestra.

timestamps

I timestamp sono sempre mantenuti nel filesystem, quindi sei limitato da qualsiasi tracciamento temporale offerto attraverso di essi (EXT3, EXT4, XFS, ecc.).

Filesystem

Se sei curioso, dai un'occhiata a questo argomento di Wikipedia intitolato: Confronto di file system . Ha l'elenco più esteso di file system di cui sono a conoscenza insieme a una bella tabella con le varie funzionalità e lo stato del supporto o meno all'interno di un determinato filesystem.

Riferimenti


Grazie per l'aggiornamento, questo aiuta. In realtà, ho letto qui che ext4 può mantenere le date di creazione ma questo non è stato ancora implementato nel kernel.
terdon

@terdon - sì, ha senso che alcuni filesystem lo supportino. Mi sembra da tempo in ritardo, capisco in passato perché è stato lasciato fuori, ma tutto è progredito così tanto dall'inizio che non ha senso non esplicitamente avere questo. Inoltre puoi disabilitare il supporto per i tempi di accesso in modo che possa essere implementato in modo simile e quindi disabilitato se davvero non lo desideri.
slm

18

OSX tiene traccia della creazione del file, ma la maggior parte degli altri non lo fa, quindi non c'è modo di conoscere il tempo trascorso dalla creazione del file. È possibile ottenere il tempo trascorso dall'ultima modifica praticamente su qualsiasi sistema operativo.

Non esiste un'utilità di shell portatile per recuperare il tempo di modifica di un file, tranne lsche ha un output che è quasi impossibile da analizzare. Sotto Linux, il seguente comando stampa l'età di un file:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

Sotto Linux, puoi usare stat -c %Y -- "$filename"come sinonimo di date +%s -r "$filename".

OSX datee statcomandi sono diversi. Puoi usare il seguente comando:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

I sistemi Linux non integrati e OSX hanno Perl installato per impostazione predefinita.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

Dipende dal sistema operativo o dal filesystem? Questo Q&A sembra implicare che il filesystem li mantiene, ma il kernel deve fornire un metodo per accedervi.
terdon

@terdon - vedi i miei aggiornamenti.
slm

@terdon Both. Che le domande e risposte che colleghi siano corrette, i filesystem attuali tengono traccia del tempo di creazione da un po 'di tempo. In FreeBSD, puoi effettivamente ottenerlo stat, in Linux la syscall non è stata rielaborata, quindi devi ricorrere all'hacking debugfs.
wingedsubmariner

1
@wingedsubmariner Con l'avvertenza che il tempo di creazione nel filesystem spesso non è la data di creazione nell'applicazione, come molte applicazioni usano create-new-then-move come metodo per salvare una nuova versione anziché sovrascrivere sul posto.
Gilles 'SO- smetti di essere malvagio' il

4

Sulla base della risposta di Gilles, ecco una funzione bash che restituisce la durata del file in secondi o errore.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

1
Funzione ordinata, facile da adattare aggiungendo una semplice divisione per vedere l'età in Ora, Giorni, Settimana ....
Emmanuel Devaux

0

Puoi usare stat -f%B, ls -lUo mdls -n kMDItemFSCreationDateper vedere l'ora di creazione (nascita) in OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10

0
stat -c %Y <filename>

guardare man statper -cle opzioni (formato)

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.