1

我需要使用以下 GNUfind命令搜索目录的内容:

查找路径-type f -name file1 -o -name file2 -o -name file3

当我在我的 Linux shell 中执行此命令时,该find命令返回退出代码 0。当我在子进程调用中执行相同的命令时,该find命令返回退出代码 1:

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。

4

3 回答 3

2

尽管您发现了问题,但对于您试图实现的如此简单的事情,我不会shell-outos.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
于 2013-03-15T11:30:46.087 回答
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

你不必担心逃跑,我猜这是你麻烦的原因。

于 2013-03-15T11:07:26.840 回答
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是问题的根本原因。

于 2013-03-15T11:14:06.083 回答