在目录中查找两天的文件,即今天和昨天

在目录中查找两天的文件,即今天和昨天

我需要一个命令或 shell 脚本来查找 Linux 中今天和昨天的文件夹中的文件。

例子

如果我今天运行该命令,它应该会提供今天和昨天创建的文件列表。

我尝试了以下命令,但没有得到预期的输出:

find . -type f -mtime +2 -prune -o -mtime +1 -exec ls -ltr {} \;

它只给了我今天的一份文件以及昨天和前天的一些文件。

答案1

使用 GNU find

find . -daystart -type f -mtime -2 -mtime +-1 -ls

将为您提供昨天 00:00:00 到今天 23:59:59.999999999 之间最后修改的文件。它可能会在从/到夏令时的切换(在有冬令时/夏令时的时区)中给出错误的结果,因为它计算从今天开始的 24 小时单位数,并且在从夏令时切换到/从夏令时的前后,有长达 23 或 25 小时的一天。

你也可以这样做(仍然使用 GNU find):

find . -type f -newermt yesterday ! -newermt tomorrow -ls

但这将给出明天恰好在 00:00:00.000000000 修改的文件,而不是昨天那个时间修改的文件。文件的最后修改时间是在纳秒之内的可能性极小,但对于修改时间已任意设置的文件touch或不具有亚秒时间粒度的文件系统上的文件来说,这种情况就可能发生。

zsh

autoload age # best in ~/.zshrc
ls -lrtd -- *(D.e:'age yesterday tomorrow':)

或者递归地使用find

ls -lrtd -- **/*(D.e:'age yesterday tomorrow':)

(关于边界的注释与find -newermt上面相同)。


至于为什么你没有得到正确的结果:

find . -type f -mtime +2 -prune -o -mtime +1 -exec ls -ltr {} \;

首先请注意-a(省略时隐含) 优先于-o,因此上面实际上是:

find . \( -type f -a -mtime +2 -a -prune \) -o \
  \( -mtime +1 -a -exec ls -ltr {} \; \)

所以-type f只适用于第一组。

-mtime +2选择年龄向上舍入到第二天(24 小时)单位严格大于 2 的文件,即上次修改时间超过 48 小时前(与当前日期相比)的文件,以及-mtime +1上次修改时间更长的文件比 24 小时前。

您需要将年龄与一天的开始时间进行比较(因此是 (GNU Specific) -daystart)。

另请注意,使用 时-exec ls -lrt {} \;,您将ls每个文件运行一个,因此-rt对文件进行排序的选项是无用的,因为ls只有一个文件要排序。您可以-exec ls -lrt {} +改为使用,但即使如此,如果文件列表很大,ls可能会被调用多次。

相关内容