Python rsync脚本目录名镜像

标签 python linux rsync

我有一个脚本,可用于使用 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/

相关文章:

linux - 主机:解析/etc/resolv.conf 失败

Shell:rsync 错误地解析文件名/路径中的空格

Rsync 复制目录内容但不复制目录本身

python - 将 block 状序列分成偶数 block ?

python - BeautifulSoup 不解析 div 类

php - 如何从 ash (bash) 将数据发布到 php

linux - Unix:最后一个命令 - 如何执行文件输入的子命令?

linux - 如何打印/记录 rsync 计算的校验和?

python - 根据其 CA 验证 CRL

python - 尝试创建带有锁定的简单按钮推送播放