我想在有多个条件的情况下执行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()
有人能解释一下我错过了什么吗?谢谢!
发布于 2015-01-06 01:56:22
我也遇到了这个问题,我相信你现在已经弄明白了,但我想我会权衡一下,以防其他人遇到同样的问题。你会发现,这是由于Python在使用Popen时实际在做什么(当使用shell=True时,python基本上只是使用/bin/sh -c来传入命令(Python's subprocess.Popen() results differ from command line?)。shell默认情况下为False,因此如果省略此参数或将其设置为False,则将使用'executable‘中指定的任何内容。文档在这里有更多的细节: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()
发布于 2019-05-21 05:05:00
在Python3.7中,subprocess.run()你可以把空格上的命令拆分成一个列表,字符串就可以了。
除了subrocess.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'')
发布于 2013-03-18 13:08:08
至少,需要避开那里的*。
在第二行,通过反斜杠转义(和)(将"\(“和"\)”传递给shell)
cmd = ["find", ".", "-type", "f", "\\(", "-iname", "\\*foo\\*", "!", "-name", ".\\*", "\\)"]
或者甚至只是摆脱那些(和)-
cmd = ["find", ".", "-type", "f", "-iname", "\\*foo\\*", "!", "-name", ".\\*"]
应该可以很好地工作
https://stackoverflow.com/questions/15470005
复制相似问题