我认为cron 使用/bin/sh 来执行命令。 sh 通常是 bash 的子集,并且您没有做任何特定于 bash 的操作。
仅当cd 命令成功时才执行rm 命令:
0 * * * * cd home/docs/reports/ && rm -r *
注意请稍等我测试一下。如果这个笔记不见了,我已经尝试过了,它可以工作。
是的,它有效。 (请注意,测试目录是否存在不太可靠;有可能该目录存在但您不能cd 进入它,或者它可能在测试和cd 命令之间不再存在。)
但实际上你不需要使用这样的复合命令:
0 * * * * rm -r home/docs/reports/*
仍然是 && 技巧,以及对应的 || 运算符仅在第一个命令失败时执行第二个命令,对于更复杂的操作非常有用。
(您的意思是/home/docs 而不是home/docs?后者将相对于您的主目录进行解释。)
虽然当我尝试它时它工作正常,但使用它需要您自担风险。任何时候将rm -r 与通配符组合在一起,都会存在风险。如果可能,请在您确定不关心的目录中进行测试。如果您想尽可能确定所有内容都已删除,您可以考虑使用rm -rf。最后,请记住,* 通配符与名称以 . 开头的文件或目录不匹配。
#include <stddisclaimer.h>
编辑:
cmets 让我对您想要做的事情有了更好的理解。这些是用户在创建后不久将下载的文件(对吗?),因此您不想删除不到 5 分钟的文件。
假设你有 GNU findutils,你可以这样做:
0 * * * * find /home/docs/reports/* -cmin +5 -delete 2>/dev/null
对find 使用-delete 选项意味着您一次删除一个文件和/或目录,而不是删除整个子树;主要区别在于不会删除包含新文件的旧目录。将-delete 应用于非空目录将失败并显示错误消息。
阅读 GNU 查找文档 (info find) 以获取有关 -cmin 和 -delete 选项的更多信息。请注意,-ctime 操作的是文件最后一次状态更改的时间,不是它的创建时间(Unix 不记录文件创建时间)。对于您的情况,可能是一样的。
(如果省略路径中的/*,则会删除reports目录本身。)