2012-06-26 3 views
11

Я пишу сценарий оболочки, в котором я должен найти последнюю дату изменения файла.Команда Unix (кроме 'stat' и 'ls'), чтобы получить дату изменения файла без разбора

Stat команда недоступна в моей среде.

Так что я использую 'ls', как показано ниже, чтобы получить желаемый результат.

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

Но я читал на многих форумах, что parsing ls is generally considered bad practise. Хотя он (возможно) отлично работает отлично, он не гарантирует работу каждый раз.

Есть ли другой способ получить дату изменения файла в сценарии оболочки.

ответ

20

Как насчет использования команды find?

например,

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

Эта конкретная строка формата дает вывода, как это: 2012-06-13 00:05.

find man page показывает директивы форматирования, которые вы можете использовать с printf, чтобы настроить выход на то, что вам нужно. Раздел -printf format содержит все детали.

Сравнить ls выход на 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 

Конечно, вы можете писать скрипты в любом количестве языков такого Python или Perl и т.д., чтобы получить ту же информацию, однако просить "команды Unix «звучало так, будто вы искали« встроенную »команду оболочки.

EDIT:

Вы могли бы также inovke Python из командной строки, как это:

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

или в сочетании с другими командами оболочки:

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

как возвращение: Wed Jun 13 00:05:29 2012

+2

Если 'stat' нет, есть хороший шанс найти' -printf' вариант тоже. 'stat' не является стандартной командой Unix, а' -printf' является расширением Gnu. – jlliagre

+0

@jlliagre хорошо, надеюсь, OP сообщит нам, если это приемлемое решение или нет. Если нет, мы можем думать о других вариантах. – Levon

+0

OSX (10.9): У нас есть stat, но нет printf. –

3

У вас есть perl?

Если это так, вы можете использовать его встроенную функцию stat, чтобы получить mtime (и другую информацию) о названном файле.

Вот небольшой скрипт, который принимает список файлов и выводит время модификации для каждого из них:

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

Пример вывода:

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

Модуль File::stat подменяет stat вызова с более удобная для пользователя версия:

3

в зависимости от вашей операционной системы вы могли бы просто использовать

date -r FILENAME 

Единственная версия UNIX это не кажется, работает на это Mac OS, где в соответствии с человеком файлов, то опция -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. 

вместо

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

'date -r' не доступен на OS X :( – jm3

+0

Только что пробовал 10.12 (Sierra), он доступен – 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"