在 Unix 中使用 shell 脚本删除超过 10 天的文件

170

我想删除一个文件夹中从当前日期往回10天内的脚本文件。 这些脚本看起来像这样:

2012.11.21.09_33_52.script
2012.11.21.09_33_56.script
2012.11.21.09_33_59.script

脚本将通过Crontab每10天运行一次,这就是我需要当前日期的原因。


你看过 man date 的文档了吗? - Jens
4
你需要根据文件名还是文件修改时间来进行删除? - Barmar
我需要一个完整的脚本:) 我找到了一个例子,但我不确定这是否适用:find /home/scripts/ . -name '*.script' -mtime +10 -exec rm -rf '{}' ; - Steve88
3个回答

528

find 是这种任务的常用工具:

find ./my_dir -mtime +10 -type f -delete

解释

  • ./my_dir 代表你的目录(用你自己的替换)
  • -mtime +10 指早于10天之前
  • -type f 只包括文件
  • -delete 毫不意外,在执行整个命令之前,先将其删除以测试您的 find 过滤器

请确保 ./my_dir 存在,以避免出现意外情况!


97
在类似这样的命令中,务必非常小心地提供绝对路径!曾经我在一个定时任务中使用了类似这样的命令,不小心删除了我的生产邮件服务器上十天前的所有文件,我可以告诉你,从这种情况下恢复过来一点也不好玩。 - DSimon
确保你把删除操作放在最后!我最终删除了一个目录而不仅仅是文件,虽然在我的情况下并没有太大关系,但可能会很痛苦。 - alimack
1
@DSimon感谢您分享您的恐怖故事,以帮助我们避免自己的错误!我有几个目录需要这样做,所以受到您的评论的启发,在我的for a in ...循环内,我添加了一个if [ -d $a ]; then...到我的脚本中! - theglossy1
mtime 是最常见的,大多数文件系统/操作系统不关心 atime(主要取决于 /etc/fstab 中的细微设置)。 - Gilles Quénot
使用 mtime,如果一个文件被频繁使用,那么它不会被删除,对吗?为什么不使用 ctime? - MaXi32
显示剩余5条评论

26

对上面的Shell脚本进行修改,实现删除旧文件并记录日志、计算经过的时间。

#!/bin/bash

path="/data/backuplog/"
timestamp=$(date +%Y%m%d_%H%M%S)    
filename=log_$timestamp.txt    
log=$path$filename
days=7

START_TIME=$(date +%s)

find $path -maxdepth 1 -name "*.txt"  -type f -mtime +$days  -print -delete >> $log

echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> $log


... code for backup ...or any other operation .... >> $log


END_TIME=$(date +%s)

ELAPSED_TIME=$(( $END_TIME - $START_TIME ))


echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> $log
echo "Elapsed Time ::  $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss) "  >> $log

该代码增加了一些功能:

  • 使用时间戳命名日志文件
  • 指定日志文件夹
  • 仅在日志文件夹中查找*.txt文件
  • 使用type f确保仅删除文件
  • maxdepth 1确保不进入子文件夹
  • 删除7天前的日志文件(假设这是备份日志)
  • 记录备份操作的开始/结束时间
  • 计算备份操作的耗时...

注意:为了测试代码,只需使用-print而不是-print -delete。但是请仔细检查路径。

注意:确保通过date-设置时区/ntp正确设置服务器时间。此外,请使用'stat文件名'检查文件时间。

注意:可以使用mmin替换mtime以获得更好的控制,因为当处理与日期有关的文件时间戳时,mtime会丢弃所有小数部分(比+2天更早(+2 days)实际上意味着3天)。

-mtime +$days  --->  -mmin  +$((60*24*$days))

嗨@MarcoZen。我有2个finddelete命令写入同一个$log。为什么会创建三个日志文件,前两个没有内容,最后一个文件包含已删除的文件列表?我该怎么做才能使查找和删除命令不生成多个文件? - Fokwa Best
@FokwaBest - 你可能创建了另一个日志文件吗?是因为时间戳吗?你是否完全使用了上面的代码?你能否将它粘贴到pastebin上让我检查一下? - MarcoZen
嗨@MarcoZen,我不得不删除_%H%M%S。对于小文件,只生成一个日志文件,但是当要删除的文件数量很大时,会生成多个带有不同_%H%M%S的日志文件。删除此部分后,所有内容都写入一个文件。 - Fokwa Best
@FokwaBest - 有趣...我没有这个问题...很好,你已经解决了。我想你是多次调用这个脚本吧? - MarcoZen

9
如果你可以通过文件数据来工作,你可以这样做。
find -mmin +14400 -delete

3
匿名编辑者:哪个版本的find-rm-rf选项? - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接