2012-06-26 20 views
11

Piszę skrypt powłoki, w którym muszę znaleźć datę ostatniej modyfikacji pliku.Polecenie uniksowe (inne niż "stat" i "ls"), aby uzyskać datę modyfikacji pliku bez analizowania

Stat Polecenie nie jest dostępne w moim środowisku.

Więc używam 'ls', jak poniżej, aby uzyskać pożądany wynik.

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

Ale czytałem na wielu forach, że parsing ls is generally considered bad practise. Chociaż (prawdopodobnie) działa dobrze przez większość czasu, nie ma gwarancji, że będzie działać za każdym razem.

Czy istnieje inny sposób uzyskania daty modyfikacji pliku w skrypcie powłoki.

Odpowiedz

20

Co powiesz na użycie polecenia find?

np

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

Ten konkretny format string daje wyjście tak: 2012-06-13 00:05.

Modele find man page pokazują dyrektywy formatowania, których można używać z printf, aby dopasować dane wyjściowe do potrzebnych/potrzebnych. Sekcja -printf format zawiera wszystkie szczegóły.

Porównaj ls wyjście do 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 

Oczywiście można pisać skrypty w dowolnej liczbie języków takich Python lub Perl itp, aby uzyskać tę samą informację, jednak z prośbą o "Dowództwo Unix "brzmiało tak, jakbyś szukał" wbudowanego "polecenia powłoki.

EDIT:

Można też inovke Pythonie linii polecenia podobnego:

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

lub w połączeniu z innymi poleceniami powłoki:

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

zwracają: Wed Jun 13 00:05:29 2012

+2

Jeśli 'stat' nie jest dostępny, istnieje duża szansa' znaleźć opcja -printf' nie jest albo. 'stat' nie jest standardowym poleceniem Uniksa, a' -printf' jest rozszerzeniem Gnu. – jlliagre

+0

@jlliagre również, mam nadzieję, OP poinformuje nas, czy jest to wykonalne rozwiązanie, czy nie. Jeśli nie, możemy wymyślić inne opcje. – Levon

+0

OSX (10.9): Mamy stat, ale bez printf. –

3

Czy masz perl?

Jeśli tak, możesz użyć wbudowanej funkcji stat, aby uzyskać mtime (i inne informacje) o nazwanym pliku.

Oto mały skrypt, który pobiera listę plików i wyświetla czas modyfikacji dla każdego z nich:

#!/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"; 
    } 
} 

Przykładowe wyjście:

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

Moduł File::stat zasłania połączenia stat z bardziej wersja przyjazna użytkownikowi:

#!/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

zależności od systemu operacyjnego można po prostu użyć

date -r FILENAME 

Jedyna wersja UNIX to nie wydaje się, aby pracować na to Mac OS, gdzie zgodnie z plików człowieka, opcja -R jest:

-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. 

zamiast

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

'date -r' nie jest dostępne na OS X :( – jm3

+0

Próbowałem na 10.12 (Sierra), jest dostępne – 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"