关于在bash中使用crontab的建议

关于在bash中使用crontab的建议,bash,cron,Bash,Cron,我想做一个cron作业,检查文件夹是否存在,如果存在,则删除该文件夹的所有内容。例如,我知道以下内容将在使用cron时删除我文件夹的内容: 0 * * * * cd home/docs/reports/;rm -r * 但是,我意识到,如果文件夹被删除(或给出了错误的文件路径),而不是文件夹的内容被删除,cd将失败,所有文件都将在我的操作系统上被删除。为了防止这种情况再次发生,我想先检查文件夹是否存在,然后删除内容。我想做如下事情,但我不确定如何将bash脚本与cron一起使用 if [ -d

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

0 * * * * cd home/docs/reports/;rm -r *
但是,我意识到,如果文件夹被删除(或给出了错误的文件路径),而不是文件夹的内容被删除,
cd
将失败,所有文件都将在我的操作系统上被删除。为了防止这种情况再次发生,我想先检查文件夹是否存在,然后删除内容。我想做如下事情,但我不确定如何将bash脚本与cron一起使用

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

我不熟悉bash和cron(以防不明显)。

我认为
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- RRF 。最后,请记住,
*
通配符与名称以
开头的文件或目录不匹配

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

有关
-cmin
-delete
选项的更多信息,请阅读GNU查找文档(
info find
)。请注意,
-ctime
在文件最后一次状态更改时运行,而不是在文件创建时运行(Unix不记录文件创建时间)。就你的情况而言,很可能是一样的

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

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

指定#/bin/bash位于脚本顶部

使其可执行:

chmod +x script.sh

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

目前最简单的方法是在crontab的顶部执行SHELL=/bin/bash。对我来说很有用。

不确定为什么需要
cd
到目录执行命令——只需指定完整路径。这也是一个很好的解决方案。我认为在这种情况下没有必要,但这是一种很好的技术。(别忘了
chmod+x
script!)谢谢@Keith-是否有一个不太关键的操作,我可以先检查一下是否正常?例如,如果我做了'0****ls/home/docs/reports/*`这会列出所有文件吗?我原来的意思是
/home/…
。@celenius:是的,但列表将转到stdout,它
crond
将尝试通过电子邮件发送给您。如果失败,您可以执行
ls…>一些文件
。对于测试crontab命令,我经常使用
***
(不要忘记在测试后清理crontab)。有用的提示:我将我的crontab保存在版本控制系统中。@celenius:有一件事需要注意(当我在测试后忘记清理自己的crontab时发现):如果
/home/doc/reports
中没有文件,那么
rm-r/home/docs/reports/*
将生成一条错误消息,您将以自动电子邮件的形式收到。考虑添加<代码> 2 > /DEV/NULL/<代码>以丢弃任何错误信息。谢谢您的建议。最后一行是:
0****rm-r home/docs/reports/*2>/dev/null
?@celenius:Yes(除了你可能指的是
/home/..
而不是
home/..
)。请注意,如果文件是在任意时间创建的,有时会在创建文件后立即删除这些文件。这就是您想要的,还是您希望在有机会查看文件后才删除这些文件?为什么不首先避免创建这些文件呢?
chmod +x script.sh