我正在使用以下命令查找比参考文件更旧的所有文件...
find /home/testuser -name "dummyfiles*" ! -newer referencefile.txt
...按预期工作。
但是,我想对时间稍微宽松一些,以便它只查找比参考文件早几个小时的文件。
例如,如果我有一个修改日期为 的参考文件May 26 11:26
,我想查找早于May 26 9:26
(即,对参考文件有 2 小时宽大处理时间)的文件。
在此示例中,以下内容是正确的匹配...
May 26 7:00
Apr 15 14:00
...以下应该不是匹配...
Jun 13 9:00
May 26 10:00
最终我想删除我找到的所有文件,所以如果find
能够满足这个要求,我会喜欢它吗?否则,是否有任何其他替代方法可以让我删除这些文件而不会太复杂?
答案1
在 GNU 系统上,您可以执行以下操作:
TZ=UTC0 find /home/testuser -name "dummyfiles*" ! -newermt "$(
TZ=XXX2:00:00 date -r referencefile.txt +%FT%T.%N)"
也就是说,date
在比 UTC 晚 2 小时的时区打印文件的修改(因此,如果文件最后一次修改是在 15:00 UTC,date
将打印13:00
)并将find
该时间戳解释为 UTC 时间(因此在我们的示例中,将尝试查找最后在 13:00 UTC 之前修改的文件)。
这限制为最多 24 小时的偏移量(如果使用TZ=XXX-24
for则为 48 小时find
)。对于任意偏移,您可以执行以下操作:
(
export TZ=UTC0
find /home/testuser -name "dummyfiles*" ! -newermt "$(
date -d "$(date -r referencefile.txt +%FT%T.%N) - 2 hours" +%FT%T.%N)"
)
或者你可以使用perl
:
perl -MFile::Find -le '
$min_age = (-M "referencefile.txt") + 2/24;
find (sub {
print $File::Find::name if $_ =~ /^dummyfiles/ && (-M$_) > $min_age
}, @ARGV)
' -- /home/testuser
请注意,与 GNU 相反find
(但与 GNU 类似date -r
), for symlinksperl
考虑-M
它链接到的文件的年龄,而不是符号链接本身的年龄。也不考虑时间戳的亚秒部分。
答案2
尝试一下这个:
find /home/testuser -name "dummyfiles*" ! -newer referencefile.txt -mmin +120 -print
添加参数-mmin +120
find 命令将仅返回与 referencefile.txt 修改日期相比早于 2 小时的文件。
测试:
mkdir find
touch find/dummyfiles1 find/dummyfiles2 find/dummyfiles3 find/dummyfiles4 find/referencefile.txt
touch -t 8001031305 dummyfiles1 dummyfiles2
find find/ -name "dummyfiles*" ! -newer find/referencefile.txt -mmin +120
输出:
查找/虚拟文件1
查找/虚拟文件2