php – rsync同步省略目录

好吧,我可能不是第一个尝试将基于
PHP的基于Web的界面组合到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,你是我唯一的希望……

最佳答案 由于不需要创建或删除目录,因此rsync返回的列表中将丢失该目录.我不相信有任何办法可以解决这个问题.

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

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

其中$filename是您的文件名.

点赞