3

PopenでこのBASHコマンドを実行しようとしています:

find /tmp/mount -type f -name "*.rpmsave" -exec rm -f {} \;

しかし、私が得るたびに:「検索:`-exec'への引数がありません\n」がstderrにあります。

これに相当するpythonは何でしょうか?

私の素朴なアプローチは次のようになります。

for (root,files,subdirs) in os.walk('/tmp/mount'):
    for file in files:
        if '.rpmsave' in file:
            os.remove(file)

確かにこれを行うためのより良い、よりpythonicな方法はありますか?

4

3 に答える 3

4

ここには、実際には2つの質問があります。1つは、Popen構造が機能しない理由、もう1つは、os.walk適切に使用する方法です。ネッドは2番目の質問に答えたので、最初の質問に対処します。シェルのエスケープに注意する必要があります。通常、Bashは2つのシェルコマンドを分離していると解釈し、に渡されないため、これ\;はエスケープされます。(他のいくつかのシェルでは、エスケープする必要があります。);;find{}

しかし、Popenあなたがそれを避けることができるならば、あなたは一般的にシェルを使いたくないでしょう。したがって、これは機能するはずです。

import subprocess

subprocess.Popen(('find', '/tmp/mount', '-type', 'f',
                  '-name', '*.rpmsave', '-exec', 'rm', '-f', '{}', ';'))
于 2013-02-23T00:07:12.627 に答える
2

あなたが持っているのは、基本的にそれを行う方法です。調整していることは 3 つあります。1) ツリーをたどること、2) .rpmsave ファイルのみを操作すること、3) それらのファイルを削除することです。そのすべてをネイティブに行うものを、詳しく説明しなくてもどこで見つけることができるでしょうか? Bash コマンドと Python コードの複雑さはどちらもほぼ同じですが、これは驚くべきことではありません。

ただし、次のようにコードを修正する必要があります。

for root,files,subdirs in os.walk('/tmp/mount'):
    for file in files:
        if file.endswith('.rpmsave'):
            os.remove(os.path.join(root, file))
于 2013-02-22T23:59:44.687 に答える
1

あなたがこのことをたくさんやっていることに気付いたら。これは、os.walk の便利なラッパーになる可能性があります。

def files(dir):
   # note you have subdirs and files flipped in your code
   for root,subdirs,files in os.walk(dir):
      for file in files:
         yield os.path.join(root,file)

ディレクトリ内の特定の拡張子を持つ一連のファイルを削除するには:

[os.remove(file) for file in files(directory) if file.endswith('.extension')]
于 2013-02-23T00:13:54.803 に答える