我需要一个命令或 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
可能会被调用多次。