rsync同步省略目录

时间:2009-11-25 13:08:50

标签: php shell rsync

好的,我可能不是第一个试图将基于PHP网络的界面组合到rsync以简化部署的人,但是可能会有。

我们在本地有一个'QA'服务器,在Rackspace有一个'Staging'服务器。我已经设置了SSH密钥配对,因此我可以在两台服务器之间进行rsync,这一切都很有效。问题是rsync对于它决定需要更新的内容有点不稳定。

我编写的脚本首先使用'--dry-run'参数执行rsync,以获取需要传输的所有内容的列表。命令如下:

$strCheck = shell_exec(
                       "rsync " .
                       "--verbose " .
                       "--recursive " .
                       "--safe-links " .
                       "--checksum " .
                       "--dry-run " .
                       "--delete " .
                       "--delete-excluded " .
                       "--force " .
                       "--cvs-exclude " .
                       "--human-readable " .
                       "/apps/{$system}/ " .
                       "user@liveserver:/apps/{$system}_staging/"
                       );

现在一切正常,我可以将返回的字符串解析为需要删除的内容以及需要添加/更新的内容。然后,我构建一个HTML表,根据它在层次结构中的位置自动缩进每个复选框。我也使用了一些javascript,所以我可以让用户选择文件夹中的所有文件。

如果要添加/删除文件夹本身,它会将其包含在列表中。例如:

/newfolder/
/newfolder/file1.php
/newfolder/file2.php

这很棒,因为'/ newfolder /'将显示一个缩进和'/newfolder/file1.php'和'/newfolder / file2.php'将在'/ newfolder /'下面显示两个缩进。 “/ newfolder /”旁边的复选框将自动选择两个“子”文件,每个人都很高兴。

但是,如果只是将文件添加/更新到文件夹,则会省略文件夹本身:

/oldfolder/filea.php
/oldfolder/fileb.php

...

这意味着'/ oldfolder /'中的所有文件都有两个缩进,但是没有可见的机制来选择文件夹中的所有文件。

所以我的问题是:我在可用的rsync参数中缺少一些东西,我可以强制它包含任何更新文件的文件夹,或者我必须在我循环遍历数组时添加它们?如果是后者,最好的方法是什么?

帮助我Obi Stack Overflowbi,你是我唯一的希望......

1 个答案:

答案 0 :(得分:2)

由于不需要创建或删除目录,因此rsync返回的列表中将缺少该目录。我认为没有办法解决这个问题。

我认为你最好的选择是获得类似这样的路径

$path = explode(PATH_SEPARATOR, dirname($filename) );

其中$ filename是您的文件名。