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