关于在bash中使用crontab的建议

时间:2012-03-27 22:14:38

标签: bash cron

我想创建一个cron作业来检查文件夹是否存在,如果要删除该文件夹的所有内容。例如,我知道以下将使用cron删除我的文件夹的内容:

0 * * * * cd home/docs/reports/;rm -r *

但是,我意识到如果删除文件夹(或者给出了错误的文件路径)而不是删除该文件夹的内容,cd将失败并且我的操作系统上的所有文件都将被删除。为了防止这种情况发生(再次),我想首先检查文件夹是否存在,然后删除内容。我想做类似以下的事情,但我不确定如何使用cron的bash脚本。

if [ -d "home/docs/reports/" ]; then
    cd home/docs/reports/;rm -r *
fi

我是bash和cron的新手(如果不是很明显的话)。

3 个答案:

答案 0 :(得分:7)

我认为cron使用/bin/sh来执行命令。 sh通常是bash的一个子集,您没有做任何特定于bash的事情。

仅在rm命令成功时执行cd命令:

0 * * * * cd home/docs/reports/ && rm -r *

注意我在测试时请等待几分钟。如果这个说明消失了,我已经尝试过它了。

是的,它有效。 (请注意,测试目录是否存在不太可靠;目录可能存在,但您不能cd进入,或者测试和cd命令之间可能不再存在。)

但实际上你不需要使用这样的复合命令:

 0 * * * * rm -r home/docs/reports/*

仍然&&技巧和相应的||运算符仅在第一个失败时执行第二个命令,对于更复杂的操作非常有用。 / p>

(您的意思是/home/docs而不是home/docs吗?后者将相对于您的主目录进行解释。)

虽然在我尝试时这个工作正常,但使用它需要您自担风险。每次将rm -r与通配符结合使用时,都存在风险。如果可能,请在您确定不关心的目录中进行测试。如果您希望尽可能确定删除所有内容,则可以考虑使用rm -rf。最后,请记住,*通配符与名称以.开头的文件或目录不匹配。

#include <stddisclaimer.h>

编辑:

这些评论让我更好地了解了你要做的事情。这些是用户在创建后不久将要下载的文件(对吗?),因此您不想删除少于5分钟的内容。

假设你有GNU findutils,你可以这样做:

0 * * * *  find /home/docs/reports/* -cmin +5 -delete 2>/dev/null

使用-delete find选项意味着您一次删除一个文件和/或目录,而不是删除整个子树;主要区别在于不会删除包含新文件的旧目录。将-delete应用于非空目录将失败并显示错误消息。

阅读GNU查找文档(info find),了解有关-cmin-delete选项的更多信息。请注意,-ctime在文件上次状态更改时运行,创建时间(Unix不记录文件创建时间)。对于你的情况,它可能是相同的。

(如果省略路径上的/*,它将删除reports目录本身。)

答案 1 :(得分:3)

将整个命令(包括if逻辑)包装到script.sh中。

在脚本顶部指定#!/ bin / bash。

使其可执行:

chmod +x script.sh

然后在您的cron作业中指定脚本的完整路径。

答案 2 :(得分:2)

到目前为止最简单的事情是在你的crontab顶部做SHELL = / bin / bash。适合我。