1

我有一个脚本,用于使用 rsync 将文件推送回我的家用 PC。成功推送的文件名被添加到 sqlite 数据库中,因此它们不会再次被推送(因为我只想要 1 路镜像)。无论如何,我遇到的问题是,虽然脚本递归地沿着源路径向下并基于定义的扩展名推送文件,但文件沿着相同的目标根目录向下传递。

我想要的是使目标文件夹结构与源文件夹结构相同。

我想我必须在 destDir 路径中添加一些东西,但不确定是什么:

for root, dirs, files in os.walk(sourceDir):
   for file in files:
     //If some filtering criteria
     print("Syncing new file: "+file)
     cmd=["rsync"]
     cmd.append(os.path.join(root, file))
     cmd.append(destDir+ "/")
     p=subprocess.Popen(cmd,shell=False)
 if p.wait()==0:
  rememberFile(file)
4

1 回答 1

0

我认为你应该尽可能地依赖rsyncfor this 的特性,而不是试图在 Python 中重新实现它。rsync已经过广泛测试并且功能齐全。他们已经修复了您遇到的所有错误。例如,在您的原始代码片段中,您需要重建文件的完整路径(而不仅仅是文件名)并将其添加到您的destDir.

但在继续调试之前,请考虑这个替代方案。为什么不将您推送的所有文件保存在纯文本文件中,而不是 sql db?假设它被称为exclude_list.txt. 那么你的单行 rsync 命令是:

rsync -r --exclude-from 'exclude_list.txt' src dst

-r开关将使其自动遍历文件树。有关此语法的更多详细信息,请参阅此页面上的主题 #6 。

现在您只需要您的 Python 脚本来维护exclude_list.txt. 我可以想到两个选择:

  • rsync使用选项捕获的输出-v以列出已移动的文件名、解析它们并附加到exclude_list.txt. 我认为这是最优雅的解决方案。您可能只需几行就可以完成。
  • 使用您已经必须遍历树并将所有文件添加到的脚本exclude_list.txt,但删除所有单独的rsync调用。然后在最后调用rsync一次,如上。
于 2013-01-10T10:07:45.830 回答