首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python -使用Popen执行具有多个条件的find

Python -使用Popen执行具有多个条件的find
EN

Stack Overflow用户
提问于 2013-03-18 12:56:00
回答 3查看 3.6K关注 0票数 5

我想在有多个条件的情况下执行find,例如:查找foo,排除隐藏文件:

代码语言:javascript
复制
find . -type f \( -iname '*foo*' ! -name '.*' \)

Python代码:

代码语言:javascript
复制
import subprocess

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

有人能解释一下我错过了什么吗?谢谢!

EN

回答 3

Stack Overflow用户

发布于 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

按照这些思路应该是可行的。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2019-05-21 05:05:00

在Python3.7中,subprocess.run()你可以把空格上的命令拆分成一个列表,字符串就可以了。

除了subrocess.run()之外,文档中没有任何内容。

我无法将命令扩展为列表来工作,而字符串却工作得很好。

代码语言:javascript
复制
cmd = "find . -type f -iname \*foo\* ! -name .\\*"
print(cmd)
ret = subprocess.run(cmd, shell=True, capture_output=True)
print(ret)

测试:

代码语言:javascript
复制
$ 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'')
票数 0
EN

Stack Overflow用户

发布于 2013-03-18 13:08:08

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

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

代码语言:javascript
复制
cmd = ["find", ".", "-type", "f", "\\(", "-iname", "\\*foo\\*", "!", "-name", ".\\*", "\\)"]

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

代码语言:javascript
复制
cmd = ["find", ".", "-type", "f", "-iname", "\\*foo\\*", "!", "-name", ".\\*"]

应该可以很好地工作

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15470005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档