0

我们有一个目录:

/home/httpdocs/

在这个目录中可能有目录或者目录的子目录,或者子目录的子目录,等等等等,里面有xml文件(以.xml结尾的文件)——我们不知道哪个目录里面有xml文件,这些目录包含大量文件

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

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

此外,如果不使用批次轮换,这可以编写脚本吗?这个脚本可以在生产时间运行还是会阻塞系统?

萨斯

4

3 回答 3

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 出于某种原因真的很棒),这可能不会导致所需的影响。但是,下一个最佳选择是编写自己的脚本来爬取装饰有 sleep 的文件树。这需要一些时间才能完成,但对您的生产系统的影响较小。除非您真的有采取行动的压力,否则我不会建议您这样做。

于 2012-05-21T18:13:42.607 回答
2

Use find /home/httpdocs -name "*.xml" -mtime +7 -exec archive {} \; where archive is a program that archives and removes an XML file.

于 2012-05-21T18:07:33.503 回答
0

find使用 cron 工作可能最容易做到这一点。

查找命令:

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

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

现在,要将其设置为 cron 作业,crontab -e请以对 httpdocs 和备份文件夹(可能是 root,so )具有写入权限的用户身份运行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命令放入脚本并运行它,只是为了缩短行。

于 2012-05-21T18:14:51.657 回答