cron 作业删除具有特定名称的文件

cron 作业删除具有特定名称的文件

我的 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: $

相关内容