我正在使用find
bash 脚本清理一些超过一天的缓存文件:
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