如何使用子进程 tar 所有带有通配符 (*) 的文件

How to tar all files with wildcard character (*) using subprocess

这是我要在 python 下 运行 的命令。基本上我想 tar 文件夹下的所有文件:

tar -jcvf doo.tar.gz /home/user/doo/*

import subprocess

subprocess.run(['tar', '-jcvf', 'doo.tar.gz', '/home/user/doo/*'])

即returns以下错误:

tar: Removing leading `/' from member names
tar: /home/user/doo/*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

后来我用glob试了一下。

import subprocess,  glob
subprocess.run(['tar', '-jcvf', 'doo.tar.gz', glob.glob("*")])

即returns以下错误:

Traceback (most recent call last):
  File "dd.py", line 4, in <module>
    subprocess.run(['tar', '-jcvf', 'doo.tar.gz', glob.glob("*")])
  File "/usr/local/lib/python3.5/subprocess.py", line 693, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.5/subprocess.py", line 1490, in _execute_child
    restore_signals, start_new_session, preexec_fn)
TypeError: Can't convert 'list' object to str implicitly

以下方法可行,但我不确定如何一个接一个地提供所有文件名:

import subprocess,  glob
subprocess.run(['tar', '-jcvf', 'doo.tar.gz', 'hello.txt', 'world.txt'])
subprocess.run(['tar', '-jcvf', 'doo.tar.gz', glob.glob("*")])

glob returns 字符串列表。您不应将其嵌入传递给 run 的列表中,而应将其附加。

subprocess.run(['tar', '-jcvf', 'doo.tar.gz'] + glob.glob("*"))

请注意,您省略了主目录。

subprocess.run(['tar', '-jcvf', 'doo.tar.gz'] + glob.glob("/home/user/doo/*"))

Shell就是可以展开的*。因此,在您的子流程调用中指定 shell=True 以展开它。

subprocess.run(['tar', '-jcvf', 'doo.tar.gz', '/home/user/doo/*'], shell=True)