Rsync include/exclude 在 python 子进程中不起作用

Rsync include/exclude don't work in python subprocess

我使用 rsync 将文件从我的家庭计算机移动到服务器。这是我用来传输和更新仅包含 grep + glob 的文件的目录的命令。我从下面显示的目录结构中的 toplevel/ 目录执行此命令。

 rsync -r --progress --include='**201609*/***' --exclude='*' -avzh files/ user@server.edu:/user/files

这是我的主文件中工作目录的文件结构:

 - toplevel
      - items
      - files
        - 20160315
        - 20160910
          - dir1
            - really_cool_file1
        - 20160911
          - dir2

这很好用,user@server.edu:/user/files 上的文件结构与我家用电脑上的相同。


我写了一个 python 脚本来执行此操作,但它不起作用。还传过来files/20160315,这不是我想要的

 #!/usr/bin/env python3
 import os
 from subprocess import run

 os.chdir("toplevel")

 command_run = ["rsync", "-r",
           "--progress",
           "--include='**201609*/***'",
           "--exclude='*'",
           "-avzh",
           "files/", "user@server.edu:/user/files"]

 run(command_run, shell=False, check=True)

这是怎么回事?当 command_run 是一个字符串时,我遇到了同样的问题,我用 shell=True.

将它传递给了 subprocess.run()

其中一些引号在传递给被调用进程之前被 shell 删除。如果您使用默认 shell=False 调用程序,则需要自己执行此操作。这个小脚本会告诉你你的参数需要是什么样的

test.py

#!/usr/bin/env python3
import sys
print(sys.argv)

然后运行你的命令行

~/tmp $ ./test.py -r --progress --include='**201609*/***' --exclude='*' -avzh files/ user@server.edu:/user/files
['./test.py', '-r', '--progress', '--include=**201609*/***', '--exclude=*', '-avzh', 'files/', 'user@server.edu:/user/files']
~/tmp $