使用 +mtime 、 +mmin 选项时出现奇怪的行为“查找命令”

使用 +mtime 、 +mmin 选项时出现奇怪的行为“查找命令”

我有一台生产服务器。我有 1 个特定对象的目录,从不同的网络节点收集文件后,它将不断堆积文件。因此,它的子目录中包含 2021 年 5 月以来的文件。它通常每小时创建一天的子目录并将文件推送到这些子目录中。子目录结构 -

在此输入图像描述

我使用以下命令find . -type f -mtime +2 | xargs ls -ltr 列出了 2 天前的文件以将其删除。

但是当我运行命令进行检查时,我发现它们以意想不到的方式排序。

在此输入图像描述

正如您在上面看到的,理想情况下它应该先短接 10-03 文件,然后短接 11-03,但其作用恰恰相反。另一件事是它还列出了当天的文件(18-03)。那么有人可以在上面遮光吗?

请注意,目录大小为 11G 。而且文件一般每分钟都在堆积,那么这有什么影响吗?

发行版-红帽企业 Linux 服务器版本 7.6 (Maipo)

答案1

find . -ctime +2报告其文件最后更改状态时间已存在 3 天或更久(其中开始时间find和文件的 ctime 之间的差值,向下舍入为整数天数严格大于 2)。

ctime可以打印的ls -lc会在任何有关文件的任何内容被修改时更新(除了它的访问时间):当任何目录中的条目被重命名时,当它与新目录(取消)链接时,当其内容或权限或其他元数据发生变化时......

ls -l默认显示且ls -t默认排序的时间戳是最后修改时间。仅当内容被修改时才会更新该值(尽管也可以像使用命令一样任意设置touch)。这可以看作是文件内容的创建时间

除了那些和上次访问时间,在某些系统上,还有一个出生时间又名创建时间,尽管它通常不如最后修改时间。对于最新版本的 GNU ls(不在 RHEL7 系统上),它可以显示为ls -l --time=birthls -l --time=creation

要查找上次修改时间超过两天的常规文件,并将它们传递给它,ls以便它按从最旧到最新的顺序列出它们,您可以执行以下操作:

find . -type f -mtime +1 -exec ls -lrtd {} +

不要使用which 无法处理(with 除外)xargs的输出。findfind -print0 | xargs -r0...

不过xargsfind -exec cmd {} +可能会运行多个 的实例cmd,这将导致在输出时产生几批独立排序的文件。

为了避免这种情况,您可以使用zsh并执行以下操作:

autoload zargs
zargs -- ./**/*(D.m+1Om) -- ls -Uld

或者使用 GNUxargs进行分割:

print -rNC1 -- **/*(ND.m+1Om) | xargs -r0 ls -Uld --

(作为不排序的-UGNU扩展(不必要,因为已经对它们进行了排序)。您可以用其他实现替换)。lszsh-rtls

您始终可以尝试完全不拆分,但可能会遇到可传递给命令的长度或参数+环境的限制并看到参数列表太长错误:

ls -lrtd -- **/*(D.m+1oN)

如果您无法安装 zsh,使用findsortsed和实用程序的 GNU 实现xargsls如 RHEL7 上所示),您可以执行以下操作:

find . -type f -mtime +1 -printf '%T@:%p\0' |
  LC_ALL=C sort -zn |
  LC_ALL=C sed -z 's/^[^:]*://' |
  xargs -r0 ls -Uld

我们手动按 mtime 对文件进行排序,方法是将find其打印为数字%T@,使用sort -n对其进行排序,sed删除它,并将xargs列表传递给ls所需的任意多个调用,每个调用都被告知不要使用 进行排序-U。所有这些都使用 NUL 分隔的记录完成,因此它可以使用任意文件路径。

无论如何,要使用 GNU 删除这些文件find,您只需要使用其-delete谓词:

find . -type f -mtime +1 -delete

相关内容