需要从超过x天的未知目录中删除* .xml

时间:2012-05-21 17:59:01

标签: bash shell

我们有一个目录:

/家/的httpdocs /

在此目录中可能有目录的目录或子目录,或子目录的子目录,依此类推,包含XML文件(以.xml结尾的文件) - 我们不知道哪个目录包含xml文件和这些目录包含大量文件

我们要归档所有文件并将其从实际目录中删除,以便我们只包含上述目录中最近7天的xml文件。

有人向我提到,logrotate是一个很好的选择,这是最好的方法,如果是这样 - 我们将如何设置它?

如果不使用lot旋转,这可以编写脚本吗?这个脚本可以在生产时间运行还是会让系统陷入困境?

SAS

3 个答案:

答案 0 :(得分:3)

find -name "*.xml" -mtime +7 -print0 | tar -cvzf yourArchive.tar.gz --remove-files --null --files-from -

将创建一个gzip压缩tar文件'yourArchive.tar.gz',其中包含当前目录中的所有* .xml文件以及在过去24 * 7小时内未更改的任何深度子目录以及将这些文件添加到tar档案文件被删除。

编辑:

  

这个脚本可以在生产时间运行,还是会陷入困境   系统

实际取决于您的系统。这确实会产生大量的I / O负载。如果您的生产系统使用大量I / O并且您没有碰巧拥有一个出色的I / O子系统(如使用光纤通道等连接的巨大raid系统),那么这将对您的性能产​​生一些明显的影响。这有多糟糕取决于更多细节。

如果系统负载是一个问题,那么你可以创建一个跟踪文件的小型数据库,也许使用inotify,它可以在更长的时间内在后台运行,而不会引起注意。

您也可以尝试使用renice设置所提及进程的优先级,但由于问题是I / O而不是CPU(除非您的CPU糟透了,并且您的I / O由于某种原因非常好) ,这可能不会产生预期的效果。但接下来最好的选择是编写自己的脚本来爬行用sleeps修饰的文件树。这需要一些时间才能完成,但对生产系统的影响会更小。除非你真的有行动的压力,否则我不会推荐任何这个。

答案 1 :(得分:2)

使用find /home/httpdocs -name "*.xml" -mtime +7 -exec archive {} \;其中archive是一个存档和删除XML文件的程序。

答案 2 :(得分:0)

使用find和cron作业执行此操作可能最简单。

find命令:

find /home/httpdocs -name \*.xml -ctime +7 -exec mv -b -t /path/to/backup/folder {} +

这会将/ home / httpdocs树中以.xml结尾的任何文件移动到您提供的备份文件夹,从而备份任何将被覆盖的文件(-b)。

现在,要将其设置为cron作业,请以对httpdocs和备份文件夹(可能是root,crontab -e)具有写权限的用户身份运行sudo crontab -e。然后添加如下所示的行:

14    3    *    *    *  find /home/httpdocs -name \*.xml -ctime +7 -exec mv -b -t /path/to/backup/folder {} +

这将在每天凌晨3:14运行命令(不同时间更改3和14)。您还可以将find命令放入脚本中并运行它,只是为了缩短行。