我的 crontab 中有这个
0 3 * * * mysqldump --host=10.100.100.3 --user=用户名 --password=mypass --routines DBName | gzip > /tmp/mysqldumps/mydb.`date +"\%Y-\%m-\%d"`.gz
现在我需要创建另一个 cron 作业来实现这个场景,假设我们在 2011 年 5 月 3 日,我想删除一个月前创建的文件即 rm mydb.2011-04-03.gz
您知道如何生成这个 cron 作业吗(如何生成要删除的文件的名称)?
答案1
您有多种选择;我建议其中两种:
按日期删除文件(每天在目标目录中搜索超过一个月的文件并删除匹配项):
10 3 * * * find /tmp/mysqldumps/ -maxdepth 1 -ctime +30 -exec rm {} \;
按名称删除文件:
10 3 * * * rm /tmp/mysqldumps/mydb.`date -d "last month" +'%Y-%m-%d.gz'`
我更喜欢前者,因为它更强大。此外,如果由于某种原因,删除 cron 作业有一天没有运行,第二天前一个命令就可以解决问题。在我的第二个示例中,文件不会被删除。
答案2
除了解析文件名之外,您还可以检查文件的修改时间。
下一个命令查找目录/tmp/mysqldumps
。以 开头mydb.
并结束的文件名.gz
,如果超过 30 天,将被删除。
find /tmp/mysqldumps -name 'mydb.*.gz' -mtime +30 -exec rm {} \;
答案3
你可以使用以下命令删除超过 30 天的文件
rm -f `find /tmp/mysqldumps -mtime +30 -name mydb.\*.gz`
答案4
对于比您的示例更复杂的 cron 作业,我喜欢将 cron 作业放在 ~/cron/ 下的脚本中,然后我可以对它们进行评论,说明谁编写了它们、它们在那里的原因以及它们何时安装。
计算约会时间的一种方法是这样的。我不会把它写成一句话,尽管我确信通过多次转义和其他操作是可以做到的:
printf "%d-%02d-%02d" `date +%Y` $((`date +%m`-1)) `date +%d`
(serverfault 吞下了我的反引号......我想我已经让它们显示了)
在我看来,find 更适合删除文件。查找与您的模式匹配且早于日期的文件。它更安全,并且不会在长时间断电的情况下留下东西。
它甚至可能在一行中看起来很干净...我会寻找一个例子。
啊哈,这里有一个例子,其中文件“noooo”和“omg”由于 ./findtest/ 目录中的某些内容而被破坏:
$ ls -R
.:
findtest noooooo omg
./findtest:
mydb- file is * mydb-old-file.gz
$ rm `find ./findtest/ -name mydb*`
rm: cannot remove `./findtest/mydb-': No such file or directory
rm: cannot remove `file': No such file or directory
rm: cannot remove `is': No such file or directory
rm: cannot remove `findtest': Is a directory
$ ls -R
.:
findtest
./findtest:
mydb- file is *
好办法:
$ find ./findtest/ -name mydb* -exec rm {} \;
$ ls -R
.:
findtest noooooo omg
./findtest:
$