Come visualizzare l'ora modificata di un file?


35

Vorrei un metodo per trovare e stampare l'ora modificata di un file, da usare all'interno di uno script bash.

Ho escogitato:

ls -l $filename | cut -d ' ' -f '6-8'

Quali uscite:

Jul 26 15:05

Anche se mi piacerebbe evitare di analizzare ls, sarebbe anche utile avere l'anno.

Idealmente, vorrei vedere un output simile all'output predefinito del datecomando.

Tue Jul 26 15:20:59 BST 2016

Quali altri metodi utili sono disponibili?

Risposte:


46

Non usare ls, questo è un lavoro per stat:

stat -c '%y' filename

-cci permette di ottenere un output specifico, qui ci %yfornirà l'ultima volta modificata del file in formato leggibile dall'uomo. Per ottenere il tempo in secondi dall'epoca in cui usi %Y:

stat -c '%Y' filename

Se vuoi anche il nome del file, usa %n:

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Imposta gli identificatori di formato in base alle tue esigenze. Controllare man stat.

Esempio:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Se si desidera un output simile Tue Jul 26 15:20:59 BST 2016, utilizzare il tempo Epoch come input per date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Controlla dategli identificatori di formato per soddisfare le tue esigenze. Vedi man dateanche


5
Oltre a questa risposta, tenere presente che lsè implementato in modo incoerente tra i sistemi e che quindi non dovrebbe mai essere utilizzato per alcun tipo di automazione. Utilizzare invece comandi come state findquando si scrivono script.
Paddy Landau,

1
eccellente. Non sapevo di questo piccolo tesoro. Così tanti di loro nell'ambiente * nix / linux sono ancora da scoprire.
Ken Ingram,

1

Provai

ls -l $filename | cut -d ' ' -f '6-8'

ma se la data è inferiore a 10, manca l'ora. Questo a causa dello spazio extra prima della data se inferiore a 10. Prova questo:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

Il comando awk stampa i campi separati da tutti gli spazi (-F ''). Spero funzioni. So che questo non risponde alla domanda originale ma solo un chiarimento sul comando ls solo per data e ora. Quando su Google "Ubuntu ottieni la data e l'ora del file", questa domanda viene elencata in alto, che è quello che stavo cercando, dato che non ho bisogno anche dell'anno. Per anno, data e ora, puoi provare uno dei comandi seguenti. % m stampa il numero del mese. % b stampa l'abbreviazione del mese: rilasciare% H:% M se non sono necessarie l'ora e i minuti. % -d non stampa lo zero iniziale per il giorno del mese.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
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.