Linux:递归地将日志文件从挂载的目录移动到本地目录,同时维护本地目录中的目录结构


Linux: Move log files from a mounted dir to a local dir recursively while maintaining directory structure in local direcoty

所以我在谷歌上搜索了很多,但还没有找到答案。我有一台服务器需要实时运行并快速响应——我不希望我的访客/客户等待。然而,我已经遇到了足够多的服务器问题,我知道我需要一个好的备份,而不是像现在这样随时备份。

当我在这台服务器上尝试过mysqldump和tar时,它可以工作,但会使服务器在几个小时内相当慢。它还可能导致硬盘被填满(如果我忘记删除旧备份太久),这会导致MySQL和我的网站瘫痪。放慢服务器速度是不可接受的,所以到目前为止,我的备份大约每周只在最常见的缓慢日期/时间进行一次。然而,我不喜欢这种解决方案。

因此,我现在有了另一台服务器,我已经将其设置为主服务器的近乎实时备份。我正在设置MySQL复制和每日rsync。然后,可以从这个备份服务器上运行每日的mysqldump和tar,而不会影响主服务器的响应时间。太好了,只是我想更进一步。

我有很多数据文件一整天都会被捕获,比如日志文件和基本的访问者跟踪文件(IP、referrer、用户代理,没有恶意),这些文件不需要实时处理,我决定最好让这个备份服务器处理这些文件,而不是占用我的主服务器的资源。这给我带来了一个问题。我想把这些文件从主服务器上取下来,放到备份服务器上进行处理。文件分散在许多目录中,目录列表只会随着时间的推移而增加。因此,我想避免现在在几个目录上运行mv,并且必须继续维护该列表——一些新目录最终会被遗忘。

因此,我在主服务器上的备份服务器上的/media文件夹下安装了必要的目录。如果我只是想复制文件,我会使用scp,但我想移动它们。所以我想要一个类似于的命令

mv /media/primary/*.log /backup/.

其中mv命令递归地查找/media/primary文件夹,并通过目录向下搜索每个子文件夹,查找任何扩展名为.log的文件。然后将该文件从/media/primary/移动到/backup上的等效文件夹。因此,例如,如果我在目录/media/primary/tool1/logs和/media/permary/tool2/logs中有日志文件,我希望它们分别移动到/backup/tool1/log和/backup/tool2/logs。如果文件夹丢失,我希望(但不要求)命令创建该文件夹。一旦正确移动,文件就可以进行处理,并从备份服务器上的本地硬盘驱动器中重命名/删除。

我在这两台机器的Ubuntu 12.04服务器上。我主要使用PHP,所以我一直在为备份服务器创建一个PHP脚本,以便每天执行。该脚本可以通过SSH(phpseclib)执行系统命令。

CLI只需一个命令就可以了,但我知道这可能是不可能的。

感谢

像这样的东西怎么样

rsync -azrR --include='*.log' -f 'hide,! */' /media/primary /backup

如果您使用man rsync并键入2343g,它将带您进入解释此筛选器的行。基本上,它会从模式匹配中隐藏所有不是目录的内容(每个文件);然而,由于我也使用了--include='*.log'标志,它将覆盖该标志,并且模式将仅匹配.log文件。您也可以使用-nv标志进行试运行,看看会发生什么。