我有一个文件列表:
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 / \;
我做错了什么?
答案 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.walk
,re.match
和shutil.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/")