查找比给定文件早几个小时的文件

查找比给定文件早几个小时的文件

我正在使用以下命令查找比参考文件更旧的所有文件...

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-24for则为 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 +120find 命令将仅返回与 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

相关内容