通常没有简单的可移植 (POSIX) 方法来获取文件修改时间。
请注意,如果您的 Unix 版本find
包含 GNU 扩展(如-printf
),您可以使用它find
来获取原始日志文件的日期。如果您的版本date
不包括-v
用于及时向前和向后调整日期字符串,那么您必须找到某种方法将日期转换为纪元日期(很久以前的秒数)并使用expr
(+/- 86400* 5) 并将其转换为可用于touch
.
您已经告诉我们您正在使用 QNX,因此您的 QNX 版本find
将拥有-printf
扩展。find
这意味着您可以使用+/- 5 天来创建您的值,但不能date -v
使用expr
. QNX 文档似乎对您如何以一种简单明了的方式做到这一点保持沉默,说明了为什么一种简单的可移植(POSIX shell)方式来获取文件修改时间、设置日期、转换日期格式等会很好在现实世界中有。您需要向 QNX 专家寻求更多帮助。对不起!
为了补充 Jaypal Singh 的 GNU coreutils 解决方案,BSD/POSIX 和 Perl 方法如下。
对于 BSD 派生系统(FreeBSD、DragonFly,可能是 OS/X),用以下代码替换在@JS 的解决方案中创建$start
和变量的命令可能有效:$end
#!/bin/sh
#
middle=`stat -r file.txt | cut -d" " -f10` # file.txt could
# come from a script
# positional argument like $1
# the number date range could also come from a positional argument like $2
start=`date -v-5d -r $middle +%Y%m%d%H%S`
end=`date -v+5d -r $middle +%Y%m%d%H%S`
touch -t "$start" /tmp/s$$
touch -t "$end" /tmp/e$$
find . -type f -newer /tmp/s$$ -and ! -newer /tmp/e$$
@JS 脚本的最后一部分已经描述过了。
另一种选择涉及骑跨平台骆驼进行救援的人......就像这样:-)
当然,这可能会更好,但这是一种perl
从find2perl
输出中抄袭的方法:
#!/usr/bin/env perl
# findrange Usage: cd /dir/to/search ; findrange 5 /file/to/compare.txt
use strict; use warnings;
use File::Find ();
use vars qw/*name/;
*name = *File::Find::name;
sub wanted;
# some values to use
my $RANGE = $ARGV[0] ; # get date range
my $REF_FILE = $ARGV[1] ; # get file to compare date
my $AGE_REF = -M $REF_FILE ;
my $start = $AGE_REF - $RANGE ; # +/- days from @ARGV[0]
my $end = $AGE_REF + $RANGE ;
# Descend file system searching/finding.
# from current directory "."
File::Find::find({wanted => \&wanted}, '.');
exit;
sub wanted {
( lstat($_)) && #caches results in "_" for -M to use
-f _ &&
(-M _ > $start) &&
! (-M _ > $end)
&& print("$name\n");
}
如果它用于交互式使用,您可以添加:
if ($#ARGV != 1) { # require 2 args (last array index +1)
usage() ;
}
在运行之前/sub wanted
运行之前,以及sub usage { print "whatever \n"; exit;}
让它更花哨的东西。
干杯,