我有一台生产服务器。我有 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=birth
或ls -l --time=creation
。
要查找上次修改时间超过两天的常规文件,并将它们传递给它,ls
以便它按从最旧到最新的顺序列出它们,您可以执行以下操作:
find . -type f -mtime +1 -exec ls -lrtd {} +
不要使用which 无法处理(with 除外)xargs
的输出。find
find -print0 | xargs -r0...
不过xargs
,find -exec cmd {} +
可能会运行多个 的实例cmd
,这将导致在输出时产生几批独立排序的文件。
为了避免这种情况,您可以使用zsh
并执行以下操作:
autoload zargs
zargs -- ./**/*(D.m+1Om) -- ls -Uld
或者使用 GNUxargs
进行分割:
print -rNC1 -- **/*(ND.m+1Om) | xargs -r0 ls -Uld --
(作为不排序的-U
GNU扩展(不必要,因为已经对它们进行了排序)。您可以用其他实现替换)。ls
zsh
-rt
ls
您始终可以尝试完全不拆分,但可能会遇到可传递给命令的长度或参数+环境的限制并看到参数列表太长错误:
ls -lrtd -- **/*(D.m+1oN)
如果您无法安装 zsh,使用find
、sort
、sed
和实用程序的 GNU 实现xargs
(ls
如 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