我有这在我的crontab
0 3 * * * mysqldump --host = 10.100.100.3 --user = username --password = mypass --routines DBName | gzip> /tmp/mysqldumps/mydb.`date +“\%Y - \%m - \%d”`.gz
现在我需要创build另一个cron工作来做这个场景假设我们在2011年5月3日我想删除一个月前创build的文件ie。 rm mydb.2011-04-03.gz
任何想法如何生成这个cron作业(如何生成要删除的文件的名称)?
你有多种select; 我build议其中两个:
按date删除文件(每天将search目标目录以查找超过一个月的文件,这些匹配项将被删除):
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作业不能运行,那么第二天前一个命令就会起作用。 在我的第二个例子中,文件不会被删除。
除了parsing文件名外,还可以检查文件的修改时间。
下一个命令在/tmp/mysqldumps目录中查找。 以mydb.开头的文件名mydb. 以.gz结尾,超过30天将被删除。
find /tmp/mysqldumps -name 'mydb.*.gz' -mtime +30 -exec rm {} \;
您可以使用类似命令删除比例如30天更早的文件
rm -f `find /tmp/mysqldumps -mtime +30 -name mydb.\*.gz`
对于比你的例子更复杂的cron作业,我喜欢把脚本作业放在〜/ cron /下的脚本中,然后我可以评论他们是谁写的,他们为什么在那里以及什么时候安装的。
在你约会上做math的一种方法就是这样。 我不会把这个内容整合到一行中,尽pipe我确信它可能有多个转义和东西:
printf "%d-%02d-%02d" `date +%Y` $((`date +%m`-1)) `date +%d`
(服务器故障吞下了我的反感…我想我让他们展示)
恕我直言,find更好的删除文件。 寻找与date相比更早的文件。 这是更安全的,不会让事情在延长的权力下降。
它甚至可能看起来很干净,我会围绕一个例子。
啊哈,下面是一个例子,其中文件“noooo”和“omg”由于./findtest/目录中的某些内容而被破坏:
$ ls -R .: findtest noooooo omg
$ ls -R .: findtest noooooo omg
./findtest:
mydb-文件是* mydb-old-file.gz
$ rm`find ./findtest/ -name mydb *`
rm:不能删除`./findtest/mydb-':没有这样的文件或目录
rm:不能删除`file':没有这个文件或目录
rm:不能删除'is':没有这样的文件或目录
rm:不能删除findtest:是一个目录
$ ls -R
。:
findtest
./findtest:
mydb文件是*
好办法:
$ find ./findtest/ -name mydb* -exec rm {} \; $ ls -R .: findtest noooooo omg
$ find ./findtest/ -name mydb* -exec rm {} \; $ ls -R .: findtest noooooo omg
./findtest:
$