1

forループを使用して、検索する特定のファイル名を決定する変数インデックスを渡す、pythonスクリプトでfindコマンドを実行しようとしています。私は次の構文を使用しています。これは、python では空のセットを返しますが、ターミナルでは機能します。

for j in [1,2,3,5]:  
    file_name = cmd.getoutput('find . -type f -name "*${j}-xyz.stc" -printf "%f\n"')

明らかに、変数は私の python コードの検索式に渡されていませんが、どうすれば修正できますか? 任意の提案をいただければ幸いです。

4

3 に答える 3

3

変数は、bash と同じように Python では展開されません。あなたはおそらく欲しい:

command = r'find . -type f -name "*{0}-xyz.stc" -printf "%f\n"'.format(j)
file_name = cmd.getoutput(command)

commandsまた、このモジュールは推奨されていないことに注意してくださいsubprocess。最後に、と組み合わせて使用​​する場合、依存せずにこの関数をpythonで記述できることをおそらく指摘する必要があります。findos.walkglob.glob

テストされていませんが、このようなものは近いはずです...

import os
import glob

def find_files(glob_expr):
    for root,_,_ in os.walk(os.curdir):
        for fname in glob.iglob(os.path.join(os.curdir,root,glob_expr)):
            yield fname
for i in (1,2,3,4):
    print (list(find_files('{0}-xyz.stc'.format(i))))
于 2012-08-29T21:58:07.930 に答える
2
file_name = cmd.getoutput('find . -type f -name "*%i-xyz.stc" -printf "%%f\n"' % (j))
于 2012-08-29T21:57:57.193 に答える
1

ファイル名を文字列でシェルに渡すことは安全ではありません (セキュリティに影響を与える可能性のあるバグにつながる可能性があります)。ベスト プラクティスは、明示的なargvリストを渡すことです。

import subprocess
for j in range(1, 6):
    file_name = subprocess.check_output(['find', '.', '-type', 'f', '-name',
                                         '*%s-xyz.stc' % (j,),
                                         '-printf', '%f\\n'])

正しさを本当に気にするなら (そうするべきです!)、'%f\\0'フォーマット文字列として を使用し、出力が NUL で区切られていることを期待してください。そうしないと、名前に改行が含まれているファイルと返された 2 つのファイルの違いがわかりません。

重要性を理解するために、攻撃者がシステムで実行されているソフトウェアに次のような名前のファイルを作成するように仕向けることができる場合を考えてみましょう。

/your/top/dir/$'\n'/etc/passwd$'\n'/1-xyz.stc

find によって返された各行をファイル名として扱うと/etc/passwd、返された値の一部と見なされます。このデータをユーザーに提示したり、削除したりすると、非常に悪いことになります。

于 2012-08-29T23:30:14.600 に答える