我目前正在配置 crontab 以每小时删除显示的路径中的所有文件和目录。
我当前的解决方案是两行,所以我希望有人可以告诉我如何将其变成一行。目前,第二个命令complete
也删除了该目录。我想保留该complete
目录并只删除complete
.
我究竟做错了什么?后面不应该有斜杠吗complete
?/*
?
要删除目录中超过 60 分钟的文件:
0 */1 * * * find /root/Downloads/complete/ -type f -mmin +60 -delete
要删除目录中超过 60 分钟的目录:
0 */1 * * * find /root/Downloads/complete/ -type d -mmin +60 -exec rm -r "{}" \;
答案1
你可能的意思是
0 */1 * * * find /root/Downloads/complete/* -type d -mmin +60 -exec rm -r "{}" \;
因为在您的示例中,find
将匹配目录名称(及其下的所有内容),但使用通配符,shell 会将其扩展到目录下的所有内容(点名除外)。
答案2
仅使用这一行即可。
0 */1 * * * find /root/Downloads/complete/ \( -type f -o -type d \) -mmin +60 -delete
/root/Downloads/complete/
将仅删除自一小时前修改老化的路径下的文件和目录。
答案3
find /root/Downloads/complete/ -type d -mmin +60 -exec rm -r "{}" \;
如果目录本身一小时内没有修改,即使该目录或子目录中的文件最近已被修改,这也会删除目录及其所有内容。这可能不是您想要的。
目录的修改时间可能没那么有用。我建议您删除旧文件,然后删除目录,因为它们变空了。为了避免删除根目录,请传递-mindepth 1
.
cd /root/Downloads/complete && find . -type f -mmin +60 -delete && find . -depth -mindepth 1 -type d -empty -delete
请注意,这可能会造成破坏,例如您可能会删除刚刚创建且另一个程序正在使用的目录。根据超时删除内容很少是一个好主意。如果您需要删除某些内容,则应该在文件处理到您满意的程度后进行,而不是在任意延迟之后进行。