我有一个脚本,可用于使用 rsync 将文件推送回我的家用 PC。成功推送的文件名被添加到 sqlite 数据库中,这样它们就不会被再次推送(因为我只想要单向镜像)。无论如何,我遇到的问题是,尽管脚本递归地沿着源路径向下移动并根据定义的扩展名推送文件,但文件向下移动到相同的目标根目录。
我正在尝试的是使目标文件夹结构与源文件夹结构相同。
我想我必须在 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)
最佳答案
我认为你应该尽可能地依赖 rsync
的特性,而不是试图用 Python 重新实现它。 rsync
已经过广泛测试并且功能齐全。他们已经修复了您遇到的所有错误。例如,在您的原始代码片段中,您需要重建文件的完整路径(而不仅仅是文件名)并将其添加到您的 destDir
。
但在继续调试之前,请考虑这个替代方案。为什么不将所有已推送的文件保存在纯文本文件中,而不是 sql 数据库?假设它名为 exclude_list.txt
。那么你的单行 rsync 命令是:
rsync -r --exclude-from 'exclude_list.txt' src dst
-r
开关将使它自动遍历文件树。参见 topic #6 on this page有关此语法的更多详细信息。
现在您只需要您的 Python 脚本来维护 exclude_list.txt
。我可以想到两个选项:
- 使用
-v
选项捕获rsync
的输出以列出已移动的文件名、解析它们并附加到exclude_list.txt
。我认为这是最优雅的解决方案。您可能只需几行即可完成。 - 使用您已有的脚本遍历树并将所有文件添加到
exclude_list.txt
,但删除所有单独的rsync
调用。然后在最后调用一次rsync
,如上所述。
关于Python rsync脚本目录名镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251037/