rsync同步时忽略目录

4

好的,我可能不是第一个尝试创建基于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参数中忽略的东西,可以强制其包括任何更新文件的文件夹,或者我必须添加它们作为我循环遍历数组的一部分? 如果是后者,最好的方法是什么?
请帮帮我,坚韧不拔的Stack Overflowbi,你是我唯一的希望...

1
+1 是对问题质量和主题的肯定,也是对荒谬参考的赞扬。 - Justin Johnson
1个回答

2

由于目录不需要创建或删除,因此它将在rsync返回的列表中缺失。我认为没有任何方法可以修复这个问题。

我认为你最好的选择是像这样获取路径:

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

其中$filename是你的文件名。


谢谢你的回答。看起来在rsync中没有办法做到这一点。 - user159895

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接