我有以下find
命令,可通过调度程序触发autosys
。该命令用于删除超过X
几天的文件。
find /home/my_home/document -maxdepth 1 -type f -mtime +31 -name "qwer_*" -delete -print
qwer_*
但上述命令失败了。奇怪的是,在日志中我可以看到 find 正在挑选甚至与模式不匹配的文件
例如。
find: `/home/my_home/document/yumn.txt': No such file or directory
find: `/home/my_home/document/ztry.txt': No such file or directory
我是否遗漏了任何find
命令?
答案1
在你的上一个问题你说:
我怀疑这是由于其他一些并行作业正在删除某些文件。
这正是本例中发生的情况。你find
发现有一个文件yumn.txt
,然后该文件被删除,然后find
尝试对该文件执行某些操作但失败了。对于 ,情况也是一样的ztry.txt
。
注意,这并不意味着如果yumn.txt
没有同时删除,find
则会删除并打印它。这仅意味着在测试完成yumn.txt
之前意外消失了。find
您可能希望根据唯一的目录列表-name "qwer_*"
拒绝(首先从中了解文件的存在),因此该工具永远不需要查询文件本身(稍后,当文件不存在时)。我的测试表明情况并非总是如此。yumn.txt
find
一般来说find
,可以重新排列测试,也可以不重新排列测试。这意味着-name "qwer_*"
可以在测试之前或之后进行测试-mtime +31
等。例如,GNUfind
重新排列表达式,以便尽早执行仅基于文件名的测试。请参阅man 1 find
、-O
和-D
选项。但对于你的情况或许您首先输入的内容会首先进行测试,因此yumn.txt
需要针对-type f
和进行测试-mtime +31
,并且这些测试中至少有一项要求文件在执行测试时存在。
但即使使用 sole 也find . -name "qwer_*"
有可能遇到问题。我是这样测试的:
while true; do touch yumn.txt; rm yumn.txt; done &
然后ls yumn.txt
会不会找到文件。您可以重复ls yumn.txt
多次,有时会找到文件,有时找不到。这是意料之中的。
在我的 Debian 中,当yumn.txt
在 Btrfs 文件系统上不断创建和销毁时,find . -name "qwer_*"
并不会抱怨;或者至少在我反复测试超过 4k 次时没有抱怨。
另一方面,在我的 OpenWRT 路由器上,find . -name "qwer_*"
有时做投诉,信息几乎和你的一模一样:
find: ./yumn.txt: No such file or directory
它find
来自 BusyBox,文件系统是overlayfs
(以ext3
upperdir 为准)。结论是:在某些情况下,另一个进程删除的文件可能会发出find
抱怨(并返回非零退出状态!),即使-name
理论上可以首先拒绝该文件。
这不是一个通用的解决方案,但根据您的具体情况,您可以尝试这种方法:
find /home/my_home/document/qwer_* -maxdepth 0 -type f -mtime +31 -delete -print
现在 shell 执行模式匹配,并find
仅以匹配的文件作为起点运行。由于-maxdepth 0
find
仅检查给定的文件(如果其中至少一个恰好是目录,则相关)。这样消失yumn.txt
或类似情况就不会影响find
。可能的问题:
- 如果
qwer_*
文件被其他进程删除(如yumn.txt
was),则可能会发生find
投诉并返回非零退出状态。 - 如果文件太多,
qwer_*
那么您将得到Argument list too long
(或类似的)。 - 如果根本没有匹配,
find
将会获取文字的/home/my_home/document/qwer_*
起点并抱怨不存在的文件/目录。