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

私もこの問題に遭遇しました。これまでにあなたはこれを理解したと確信していますが、他の誰かが同じ問題に遭遇した場合に備えて、私は検討することにしました. これは、Popen を使用するときに Python が実際に行っていることが原因で発生します (shell=True が使用されている場合、Python は基本的に /bin/sh -c を使用してコマンドを渡します ( Python の subprocess.Popen() の結果) shell はデフォルトで False なので、これを省略するか False に設定すると、'executable' で指定されたものは何でも使用されます。 .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

少なくとも、そこにある*をエスケープする必要があります。

次に、バックスラッシュで(と)をエスケープします( "\\("と "\\)"をシェルに渡します)

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

または単にそれらを取り除く(と)-

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

うまくいくはずです

于 2013-03-18T05:08:08.193 に答える