Python rsync脚本目录名称镜像

时间:2013-01-10 04:53:47

标签: python linux rsync

我有一个脚本,用于使用rsync将文件推送回家用电脑。成功推送的文件名被添加到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)

1 个答案:

答案 0 :(得分:0)

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

但是在你继续调试之前,请考虑这个替代方案。而不是sql db,为什么不保留您在纯文本文件中推送的所有文件?我们说它叫做exclude_list.txt。然后你的单行rsync命令是:

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

-r开关将使其自动遍历文件树。有关此语法的详细信息,请参阅topic #6 on this page

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

  • 使用rsync选项捕获-v的输出,以列出已移动的文件名,解析它们并附加到exclude_list.txt。我认为这是最优雅的解决方案。你可以在几行内完成。
  • 使用您已有的脚本遍历树并将所有文件添加到exclude_list.txt,但删除所有单独的rsync次呼叫。然后在结尾处拨打rsync一次,如上所述。