我已经将它作为 cron 作业运行
/usr/bin/find /backups/* -mtime +5 -exec rm -rf {} \;
但它在电子邮件中给我这个错误
/usr/bin/find: `/backups/Jun-20-2014': No such file or directory
有没有办法忽略该错误而不重定向错误输出
答案1
使用xargs
方式如下:
find /backups/ -mtime +5 -print0 | xargs -0 rm -rf
-0
可以正确处理带空格的文件名。请注意,这将比 运行速度快得多,find -exec
因为它会尝试将许多文件放入一次rm
调用中。
答案2
看起来,当 shell 扩展时该文件就在那里,但是当处理它*
时,它就不再在那里了。find
您可以尝试:
/usr/bin/find /backups/ -depth 1 -mtime +5 -exec rm -rf {} \;
这将处理起始目录本身以外的/backups/
所有文件。-depth 1
答案3
这不是一个问题。find
预处理树的各个部分,当它尝试访问已删除的文件时,它会抛出 stderr。
您可以忽略错误、-prune
目录或以DFS
时尚的方式遍历,即以下之一
/usr/bin/find /backups/ -mtime +5 -exec rm -rf {} + 2>/dev/null
/usr/bin/find /backups/ -mtime +5 -prune -exec rm -rf {} +
/usr/bin/find /backups/ -depth -mtime +5 -exec rm -rf {} +
+ 可以用于接受多个参数的命令,因此你不需要运行比所需更多的 rm
这真正的问题与您使用的有关mtime
。我假设您想要删除过去五天内未修改的文件。那么您应该明确删除仅文件,即以下文件之一
/usr/bin/find /backups/ -type f -mtime +5 -exec rm -f {} +
/usr/bin/find /backups/ -type f -mtime +5 -delete
之后,您可以添加第二个 find 命令来删除空目录,即以下之一
/usr/bin/find /backups/ -mindepth 1 -type d -empty -delete
/usr/bin/find /backups/ -mindepth 1 -type d -empty -exec rm -rf {} +
根据修改时间删除目录的问题是,只有文件移入/移出目录时,修改时间才会改变。但尽管修改时间较早,但仍然可以保留过去五天内修改过的文件。
答案4
这是一丑陋的解决方法,但它在很多情况下对我都有效……
您可以通过将输出重定向到 将命令的输出存储到 var 中stdout
,如下所示:
result=$( <your find command here> 2>&1 )
由于find
成功时不输出任何内容,任何错误都会发送到stderr
,并且存储到 的输出result
只是发送到 的内容stdout
,我们重定向stderr
到stdout
以捕获 上的错误$result
,然后您可以检查 是否$result
为空(成功)或不为空(出现错误)。因此,您可以编写代码以相应地向您发送邮件:
if [ -z "$result" ]; then
# If $result is empty, find was successful
else
# The result is not empty because there was
# an error, send a mail to notify.
fi
这当然忽略了不重定向输出但由于我不知道为什么如果你不想重定向它,这个可能是一个解决方案。