Команда Unix (кроме "stat" и "ls" ), чтобы получить дату изменения файла без разбора

Я пишу оболочку script, в которой мне нужно найти последнюю дату изменения файла.

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

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

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

Но я читал на многих форумах, что синтаксический анализ ls обычно считается плохой практикой. Хотя он (возможно) отлично работает отлично, он не гарантирует работу каждый раз.

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

Ответ 1

Как насчет команды find?

например,

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

Эта конкретная строка формата дает вывод следующим образом: 2012-06-13 00:05.

найти справочную страницу показывает директивы форматирования, которые вы можете использовать с 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" звучать так, как если бы вы искали "встроенную" команду оболочки.

ИЗМЕНИТЬ

Вы также можете 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

У вас есть perl?

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

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

#!/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 с более удобной версией:

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

в зависимости от вашей ОС вы можете просто использовать

date -r FILENAME

Единственная версия unix, на которую она не работает, - это Mac OS, где, согласно файлам man, параметр -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

Ответ 4

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