2012-06-26 8 views
11

Sto scrivendo uno script di shell in cui devo trovare l'ultima data di modifica di un file.Comando Unix (diverso da 'stat' e 'ls') per ottenere la data di modifica del file senza analisi

Stat comando non è disponibile nel mio ambiente.

Così sto usando 'ls' come sotto per ottenere il risultato desiderato.

ls -l filename | awk '{print $6 $7 $8}' 

Ma ho letto in molti forum che parsing ls is generally considered bad practise. Mentre (probabilmente) funziona bene la maggior parte del tempo, non è garantito il lavoro ogni volta.

C'è un altro modo per ottenere la data di modifica del file nello script della shell.

risposta

20

Come utilizzare il comando find?

esempio,

$ find filenname -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n" 

Questa stringa particolare formato un output come questo: 2012-06-13 00:05.

Il find man page mostra le direttive di formattazione che è possibile utilizzare con printf per adattare l'output a ciò che è necessario/desidera. La sezione -printf format contiene tutti i dettagli.

Confronta ls uscita a find:

$ ls -l uname.txt | awk '{print $6 , "", $7}' 
2012-06-13 00:05 

$ find uname.txt -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n" 
2012-06-13 00:05 

Naturalmente è possibile scrivere script in qualsiasi numero di lingue tale Python o Perl, ecc, per ottenere le stesse informazioni, ma chiedendo una "comando UNIX "sembrava come se stessimo cercando un comando" built-in "della shell.

EDIT:

Si potrebbe anche inovke Python dalla riga di comando come questo:

$ python -c "import os,time; print time.ctime(os.path.getmtime('uname.txt'))" 

o se combinato con altri comandi shell:

$ echo 'uname.txt' | xargs python -c "import os,time,sys; print time.ctime(os.path.getmtime(sys.argv[1]))" 

sia ritorno: Wed Jun 13 00:05:29 2012

+2

Se 'stat' non è disponibile, c'è una buona probabilità' find opzione -printf' non è neanche. 'stat' non è un comando Unix standard mentre' -printf' è un'estensione di Gnu. – jlliagre

+0

@jlliagre bene, si spera che OP ci faccia sapere se questa è una soluzione praticabile o meno. In caso contrario, possiamo pensare ad altre opzioni. – Levon

+0

OSX (10.9): abbiamo stat ma non printf. –

3

Hai perl?

In tal caso, è possibile utilizzare la funzione integrata stat per ottenere il mtime (e altre informazioni) su un file denominato.

Ecco un piccolo script che prende un elenco di file e stampa la data di modifica per ciascuno di essi:

#!/usr/bin/perl 

use strict; 
use warnings; 

foreach my $file (@ARGV) { 
    my @stat = stat $file; 
    if (@stat) { 
     print scalar localtime $stat[9], " $file\n"; 
    } 
    else { 
     warn "$file: $!\n"; 
    } 
} 

Esempio di output:

$ ./mtime.pl ./mtime.pl nosuchfile 
Tue Jun 26 14:58:17 2012 ./mtime.pl 
nosuchfile: No such file or directory 

Il modulo File::stat ignora la chiamata stat con un altro versione user-friendly:

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::stat; 

foreach my $file (@ARGV) { 
    my $stat = stat $file; 
    if ($stat) { 
     print scalar localtime $stat->mtime, " $file\n"; 
    } 
    else { 
     warn "$file: $!\n"; 
    } 
} 
3

seconda del sistema operativo che si potrebbe utilizzare

date -r FILENAME 

L'unica versione di unix questo non sembra di lavorare su Mac OS è, dove, secondo i file man, l'opzione -r è:

-r seconds 
     Print the date and time represented by seconds, where seconds is 
     the number of seconds since the Epoch (00:00:00 UTC, January 1, 
     1970; see time(3)), and can be specified in decimal, octal, or 
     hex. 

invece di

-r, --reference=FILE 
      display the last modification time of FILE 
+0

'date -r' non è disponibile su OS X :( – jm3

+0

Appena provato il 10.12 (Sierra), è disponibile – DariusL

0
#!/bin/bash 
FILE=./somefile.txt 

modified_at=`perl -e '$x = (stat("'$FILE'"))[9]; print "$x\n";'` 

not_changed_since=`perl -e '$x = time - (stat("'$FILE'"))[9]; print "$x\n";'` 

echo "Modified at $modified_at" 
echo "Not changed since $not_changed_since seconds" 
Problemi correlati