5

我想执行find多个条件,例如:查找foo排除隐藏文件:

find . -type f \( -iname '*foo*' ! -name '.*' \)

Python代码:

import subprocess

cmd = ["find", ".", "-type", "f", "(", "-iname", "*foo*", "!", "-name", ".*", ")"]
sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print sp.communicate()[0].split()

有人可以解释我错过了什么吗?谢谢!

4

3 回答 3

1

我也遇到了这个问题,我相信你现在已经弄清楚了,但我想我会权衡一下,以防其他人遇到同样的问题。来发现,这是由于Python在使用Popen时实际在做什么(当使用shell = True时,python基本上只是使用 /bin/sh -c 来传递您的命令(Python的 subprocess.Popen() 结果与命令行不同?)。shell 默认为 False,因此如果您省略此选项或将其设置为 False,则将使用“可执行”中指定的任何内容。文档在此处更详细地介绍:https://docs.python .org/2/library/subprocess.html#subprocess.Popen

这些方面的东西应该起作用

import subprocess
cmd = 'find . -type f -iname "*foo*" ! -name ".*"'
sp = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print sp.communicate()[0].split()
于 2015-01-05T17:56:22.043 回答
0

在 python 3.7 subprocess.run() 中,您可以将空格上的 cmd 拆分为一个列表,字符串就可以了。

尽管subprocess.run()文档中没有任何内容。

我无法将命令扩展为列表以工作,而字符串工作正常。

cmd = "find . -type f -iname \*foo\* ! -name .\\*"
print(cmd)
ret = subprocess.run(cmd, shell=True, capture_output=True)
print(ret)

测试:

$ find . -type f -iname \*foo\* ! -name .\*
./foobar.txt
./barfoo.txt

$ ./findfoo.py
find . -type f -iname \*foo\* ! -name .\*
CompletedProcess(args='find . -type f -iname \\*foo\\* ! -name .\\*',
 returncode=0, stdout=b'./foobar.txt\n./barfoo.txt\n', stderr=b'')
于 2019-05-20T21:04:59.830 回答
-1

至少,需要逃避那里的*。

在第二个通过反斜杠转义 ( 和 ) (将 "\\(" 和 "\\)" 传递给 shell)

cmd = ["find", ".", "-type", "f", "\\(", "-iname", "\\*foo\\*", "!", "-name", ".\\*", "\\)"]

甚至只是摆脱那些(和) -

cmd = ["find", ".", "-type", "f", "-iname", "\\*foo\\*", "!", "-name", ".\\*"]

应该可以正常工作

于 2013-03-18T05:08:08.193 回答