即使没有匹配的文件也能成功查找

即使没有匹配的文件也能成功查找

我正在使用findbash 脚本清理一些超过一天的缓存文件:

find /tmp/my_files_*.cache -mtime +1 -delete

问题是,如果命令不匹配任何文件,它就会失败,从而阻止脚本的其余部分运行:

find: `/tmp/my_files_*.cache': No such file or directory

我目前正在通过附加|| true到命令来解决这个问题,但这不是最理想的,因为错误仍然出现在输出中,并且它允许脚本继续运行find可能引发的任何其他错误。

如果没有文件匹配,我怎么知道find没问题呢?

答案1

使用您的原始命令,它实际上并不是find无法匹配任何内容,而是您的 shell。

即当你运行时

find /tmp/my_files_*.cache -mtime +1 -delete

如果有匹配的文件,shell 的通配符功能会扩展该通配符,实际的find调用将如下所示:

find /tmp/my_files_1.cache /tmp/my_files_2.cache /tmp/my_files_3.cache -mtime +1 -delete

(这很容易变成非常长命令,在某些情况下这本身可能是一个问题)

当没有匹配项时,通配符将按原样传递,因此find调用将如下所示:

find /tmp/my_files_*.cache -mtime +1 -delete

并且像大多数程序一样,find它不会对路径参数进行任何类型的通配符扩展,因此它会尝试查找字面上名为的文件/目录/tmp/my_files_*.cache,因此出现错误。

正如 Ipor Sircer 所指出的那样,更习惯的使用方式find是给予它基本路径并让它find自己查看目录内容并根据需要应用过滤器。

类似这样的事情应该与你想要做的事情相匹配:

find /tmp -maxdepth 1 -name "my_files_*.cache" -mtime +1 -delete

答案2

find /tmp -name "*.cache" -mtime +1 -delete

答案3

如果您不关心是否有任何文件需要删除,那么就不必测试是否成功,只需丢弃任何错误:

查找 /tmp/my_files_*.cache -mtime +1 -delete 2> /dev/null

相关内容