关于在bash中使用crontab的建议

djq*_*djq 2 bash cron

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

0 * * * * cd home/docs/reports/;rm -r *
Run Code Online (Sandbox Code Playgroud)

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

if [ -d "home/docs/reports/" ]; then
    cd home/docs/reports/;rm -r *
fi
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 7

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

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

0 * * * * cd home/docs/reports/ && rm -r *
Run Code Online (Sandbox Code Playgroud)

注意我测试时请等几分钟.如果这个说明消失了,我已经尝试了它并且它有效.

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

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

 0 * * * * rm -r home/docs/reports/*
Run Code Online (Sandbox Code Playgroud)

仍然是&&技巧,以及||仅在第一个命令失败时执行第二个命令的相应操作符对于更复杂的操作非常有用.

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

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

#include <stddisclaimer.h>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

0 * * * *  find /home/docs/reports/* -cmin +5 -delete 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

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

阅读GNU查找文档(info find)以获取有关-cmin和-delete选项的更多信息.请注意,该-ctime操作是在文件的最后一次状态更改时,而不是其创建时间(Unix不记录文件创建时间).对于你的情况,它可能是相同的.

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