Unix命令(除'stat'和'ls'之外)获取文件修改日期而不解析

时间:2012-06-26 21:20:48

标签: file unix last-modified

我正在编写一个shell脚本,我必须在其中找到文件的最后修改日期。

Stat命令在我的环境中不可用。

所以我使用'ls'如下获得所需的结果。

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

但我在许多论坛上都读过parsing ls is generally considered bad practise。虽然它(可能)大部分时间都可以正常工作,但并不能保证每次都能正常工作。

是否有其他方法可以在shell脚本中获取文件修改日期。

4 个答案:

答案 0 :(得分: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命令”听起来就好像您正在寻找一个“内置”shell命令。

修改

你也可以从命令行中输入Python,如下所示:

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

或者如果与其他shell命令结合使用:

$ 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

答案 1 :(得分:4)

取决于您的操作系统,您可以使用

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

答案 2 :(得分: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来电:

#!/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 :(得分: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"