it-swarm.it

ultimo file aperto

È possibile ottenere l'ora in cui il file è stato aperto l'ultima volta e ordinare tutti i file in una directory in quei tempi?

101
student

Questo dipende esattamente da cosa intendi per "aperto", ma in generale sì. Esistono tre timestamp normalmente registrati:

  • mtime - aggiornato quando cambia il contenuto del file. Questo è il tempo "predefinito" del file nella maggior parte dei casi.
  • ctime - aggiornato quando il file o i suoi metadati (proprietario, autorizzazioni) cambiano
  • atime - aggiornato durante la lettura del file

Quindi, generalmente, ciò che vuoi vedere è il atime di un file. Puoi ottenerlo con stat o con ls. Puoi usare ls -lu per fare questo, anche se preferisco usare ls -l --time=atime (che dovrebbe essere supportato in quasi tutte le moderne distribuzioni Linux) perché non lo uso spesso, e quando lo faccio lo ricordo meglio. E a ordina per tempo, aggiungi -t flag to ls. Quindi eccoti.

C'è un grande avvertimento, però. L'aggiornamento dell'atime ogni volta che viene letto un file provoca un sacco di IO solitamente non necessari, rallentando tutto. Quindi, la maggior parte delle distribuzioni Linux ora sono predefinite all'opzione di mount del filesystem noatime, che sostanzialmente uccide gli atimes, oppure relatime, che aggiorna gli atimes solo quando viene superato un limite (normalmente una volta al giorno) o se il file è stato effettivamente modificato dalla lettura precedente. Puoi scoprire se queste opzioni sono attive eseguendo il comando mount.

Inoltre, si noti che i tempi di accesso sono inode, non per nome file, quindi se si dispone di hardlink, la lettura da uno aggiornerà tutti i nomi che si riferiscono allo stesso file.

E, sii consapevole che c non è "creazione"; la creazione non è tracciata dai filesystem Unix/Linux, il che sembra strano ma in realtà ha senso perché il filesystem non ha modo di sapere se è l'originale - forse il file è stato creato quarant'anni fa e copiato qui. E, in effetti, molti editor di file funzionano eseguendo copie sull'originale. Se hai bisogno di tali informazioni, è meglio usare un sistema di controllo della versione come git.

182
mattdm

ls -ltu elenca tutti i file, mostrandoli e ordinandoli in base al tempo di accesso.

A partire dal man ls:

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time
21
Shawn J. Goff

Il comando find è il migliore per questo. Vedi il -ctime, -mtime, e -atime opzioni

4
GBH

Se la tua scheda è destinata al consumo umano, usa ls con uno dei flag di ordinamento della data (-tu Per l'ora di accesso (lettura), solo -t Per l'ora di modifica (scrittura) o -tc Per il tempo di cambio dell'inode). Vedi risposta di mattdm per maggiori informazioni (in particolare l'avvertenza relativa a -a E la definizione di -c).

Se questo è per il consumo del programma, analizzare l'output di ls è problematico . Se Shell è zsh, non è necessario ls in ogni caso: zsh ha qualificatori di tipo globbing per ordinare le partite aumentando l'accesso (*(Oa)), modifica inode (*(Oc) ) o tempo di modifica (*(Om)). Una o minuscola ordina per età crescente.

act_on_files_by_date *(Om)

Altrimenti, se sai che i nomi dei file non contengono caratteri di nuova riga o non stampabili (nella locale corrente), puoi fare qualcosa di simile

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

Se si desidera richiamare un comando su più file contemporaneamente, è necessaria una maggiore configurazione. Si noti che act_on_files_by_date $(ls -t) non funziona in questo modo, poiché i nomi di file contenenti caratteri jolly o spazi bianchi verrebbero espansi nel risultato della sostituzione del comando. Il codice seguente funziona purché nessun nome file contenga una nuova riga o un carattere non stampabile:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

Se vuoi far fronte a nomi di file arbitrari, avrai un momento molto difficile senza ricorrere a strumenti più potenti di una Shell standard: zsh, Perl, python ...