我需要使用以下GNU find
命令搜索目录的内容:
查找路径 -type f -name file1 -o -name file2 -o -name file3 < / p>
当我在Linux shell中执行此命令时,find
命令返回退出代码0.当我在子进程调用中执行相同的命令时,find
命令返回退出代码1:< / p>
import subprocess
import shlex
findcmd = "/depot/findutils/bin/find /remote/scratch/results -type f -name 'QUEUED' -o -name 'run.pid' -o -name 'PID'"
try:
output = subprocess.check_output(shlex.split(findcmd))
except subprocess.CalledProcessError, cpe:
print cpe.output
raise cpe
输出:
Traceback (most recent call last):
File "./getaverages.py", line 63, in <module>
raise cpe
subprocess.CalledProcessError: Command '['/depot/findutils/bin/find', '/remote/scratch/results', '-type', 'f', '-name', 'QUEUED', '-o', '-name', 'run.pid', '-o', '-name', 'PID']' returned non-zero exit status 1
奇怪的是,CalledProcessError
对象输出属性与我在Linux shell中运行find
时获得的输出完全相同(返回的输出大约有15K行)。我也试过设置 bufsize = -1 ,但这没有帮助。
有任何理解这种行为的建议吗?
我使用的是Python 2.7.2,find
版本是4.2.20。
答案 0 :(得分:2)
尽管你遇到了问题,但是你想要实现这么简单的事情,我不会 shell-out ,而是使用os.walk
:
import os, os.path
search = 'file1 file2 file3'.split()
for root, dirs, files in os.walk('/path'):
for f in filter(lambda x: x in search, files):
# do something here
fn = os.path.join(root, f)
print 'FOUND', fn
答案 1 :(得分:0)
如果您使用plumbum,任务就像:
一样简单from plumbum.cmd import find
cmd = find['/remote/scratch/results']['-type', 'f']['-name','QUEUED']['-o']['-name', 'run.pid']['-o']['-name', 'PID']
cmd() # run it
你不必担心逃跑,我猜你的问题就是逃避原因。
答案 2 :(得分:0)
似乎在15K输出的中间我错过了以下几行:
/depot/findutils/bin/find: /remote/scratch/results/tmp.na.8Em5fZ: No such file or directory
/depot/findutils/bin/find: /remote/scratch/results/tmp.na.k6iHJA: No such file or directory
/depot/findutils/bin/find: /remote/scratch/results/tmp.na.ZPe2TC: No such file or directory
事实证明,我正在搜索的路径包含模拟结果,并且会定期删除超过3天的文件。似乎当正在执行find
时发生删除是问题的根本原因。