我正在编写一个 shell 脚本,我必须在其中找到文件的最后修改日期。
Stat
命令在我的环境中不可用。
所以我使用'ls'
如下来获得想要的结果。
ls -l filename | awk '{print $6 $7 $8}'
但我在许多论坛上读到解析ls
通常被认为是不好的做法。虽然它(可能)大部分时间都可以正常工作,但不能保证每次都能正常工作。
有没有其他方法可以在 shell 脚本中获取文件修改日期。
我正在编写一个 shell 脚本,我必须在其中找到文件的最后修改日期。
Stat
命令在我的环境中不可用。
所以我使用'ls'
如下来获得想要的结果。
ls -l filename | awk '{print $6 $7 $8}'
但我在许多论坛上读到解析ls
通常被认为是不好的做法。虽然它(可能)大部分时间都可以正常工作,但不能保证每次都能正常工作。
有没有其他方法可以在 shell 脚本中获取文件修改日期。
使用find
命令怎么样?
例如,
$ find filenname -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n"
这个特殊的格式字符串给出如下输出:2012-06-13 00:05
.
find 手册页显示了您可以使用的格式化指令,以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 命令。
编辑:
你也可以像这样从命令行中 inovke 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
根据您的操作系统,您可以使用
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
你有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";
}
}
#!/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"