如何在python中使用子进程复制文件?

时间:2014-03-22 02:05:19

标签: python-2.7 subprocess

我有一个文件列表:

file_list=['test1.txt','test2.txt','test3.txt']

我想查找这些文件并将其复制到目标文件夹。我有以下代码:

for files in file_list:
    subprocess.call(["find", "test_folder/",
                    "-iname", files,
                    "-exec", "cp", "{}",
                    "dest_folder/",
                    "\;"])

但是,我一直收到错误:

find: missing argument to `-exec

shell命令如下所示:

$ find test_folder / -iname'test1.txt'-exec cp {} dest_folder / \;

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你不需要逃避分号。这是对我有用的:

import shlex
import subprocess

file_list = ['test1.txt','test2.txt','test3.txt']

cmd = 'find test_folder -iname %s -exec cp {} dest_folder ;'
for files in file_list:
    subprocess.Popen(shlex.split(cmd % files))

另见:

希望有所帮助。

答案 1 :(得分:1)

你不需要逃避争论; subprocess模块在​​没有shell的情况下直接调用find命令。将"\;"替换为";",您的命令将按原样运行。

您可以将搜索结合到一个命令中:

from subprocess import call

expr = [a for file in file_list for a in ['-iname', file, '-o']]
expr.pop() # remove last `-o`
rc = call(["find", "test_folder/", "("] + expr + [")", "-exec", 
           "cp", "-t", "dest_folder/", "--", "{}", "+"])

如果需要,您还可以将expr列表合并到一个-iregex参数中。

您不需要find命令;您可以使用os.walkre.matchshutil.copy在纯Python中实现复制:

import os
import re
import shutil

found = re.compile('(?i)^(?:%s)$' % '|'.join(map(re.escape, file_list))).match
for root, dirs, files in os.walk('test_folder/'):
    for filename in files:
        if found(filename):
            shutil.copy(os.path.join(root, filename), "dest_folder/")