我想创建一个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的新手(如果不是很明显的话)。
答案 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。适合我。