我使用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
是一个字符串时,我遇到了同样的问题,我将subprocess.run()
传递给了shell=True
。
答案 0 :(得分:1)
在传递给被调用进程之前,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 $