我有一个脚本,用于使用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)
答案 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
一次,如上所述。