Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Linux:递归地将日志文件从装入的目录移动到本地目录,同时在本地目录中维护目录结构_Php_Linux_Ubuntu 12.04 - Fatal编程技术网

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

Php Linux:递归地将日志文件从装入的目录移动到本地目录,同时在本地目录中维护目录结构,php,linux,ubuntu-12.04,Php,Linux,Ubuntu 12.04,所以我已经在谷歌上搜索了一段时间,但我还没有找到答案。我有一台服务器需要实时运行并快速响应-我不希望我的访问者/客户等待。然而,我已经有足够多的服务器问题,我知道我需要一个好的备份,而不是我现在想要的备份 当我在这台服务器上尝试mysqldump和tar时,它可以工作,但会使服务器在几个小时内运行非常缓慢。它还可能导致硬盘驱动器被填满(如果我忘记删除旧备份的时间太长的话),从而导致MySQL和我的站点瘫痪。降低服务器速度是不可接受的,因此我迄今为止的备份大约每周只在最常见的慢速日期/时间进行一次

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

当我在这台服务器上尝试mysqldump和tar时,它可以工作,但会使服务器在几个小时内运行非常缓慢。它还可能导致硬盘驱动器被填满(如果我忘记删除旧备份的时间太长的话),从而导致MySQL和我的站点瘫痪。降低服务器速度是不可接受的,因此我迄今为止的备份大约每周只在最常见的慢速日期/时间进行一次。然而,我不喜欢这个解决方案

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

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

因此,我已在备份服务器的/media文件夹下的主服务器上挂载了必要的目录。如果我只是想复制文件,我会使用scp,但我想移动它们。所以我想要一个命令,它可以执行如下操作:

mv /media/primary/*.log /backup/.
其中mv命令递归地查找/media/primary文件夹,并通过目录向下搜索每个子文件夹,查找扩展名为.log的文件。然后将该文件从/media/primary/移动到/backup上的等效文件夹。例如,如果我在/media/primary/tool1/logs和/media/primary/tool2/logs目录中有日志文件,我希望它们分别移动到/backup/tool1/logs和/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
标志进行试运行,看看会发生什么。

类似于
rsync-azrR-include='*.log'-f'hide,!*/'/媒体/主/备份
?因此我看到了-azrR获取存档、压缩、递归和相对路径。我理解——包括部分。然而,我不是苏什么‘藏起来!’一份就行了。根据手册页,它将删除目标上的文件和目录。我不想从目的地拿走任何东西。我希望将文件从主服务器移动到备份服务器。我是否误解了文件筛选器?如果您使用
man rsync
并键入
2343g
,它会将您带到解释此筛选器的行。基本上,它会从模式匹配中隐藏不是目录的所有内容(每个文件);但是,由于我也使用了
--include='*.log'
标志,它将覆盖该标志,并且模式将只匹配
.log
文件。您也可以使用
-nv
标志进行试运行,看看会发生什么。好的,我进行了试运行。。。它似乎递归地搜索目录树并查找日志文件。使用--remove source files选项,我似乎还可以从主驱动器中删除这些文件。除了遍历目录树并指定找到的各个日志文件之外,试运行并没有告诉我更多。然而,它并没有说移动或删除或任何其他之前或之后的行与完整的文件名和路径。然而,这显示了潜力。我试试看@康纳,你能给我一个答案,这样我就可以把它记下来吗?感谢这似乎在试运行时起作用,但我认为需要--remove source files选项才能从/media/primary中删除文件。我还没有测试过它(出现了其他问题),但是如果它不起作用或者需要进一步调整,我会在这里添加一条评论。