17

必要なファイルを確実に削除したい。私は次のようなコードを持っています

dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)

dirとのfile値はデータベースから取得されます。実行しないようにするにはどうすればよいrm -rf /ですか?

行う前に確認すべきことは何rm -rfですか?

4

6 に答える 6

30

-r1つのファイルを削除するだけの場合は、スイッチを使用しないでください。また、ファイル名にスペースが含まれている可能性があります。

代わりに、Pythonのosモジュールの関数を使用することをお勧めします。

dirname = "/some/path/"
filename = "somefile.txt"
pathname = os.path.abspath(os.path.join(dirname, filename))
if pathname.startswith(dirname):
   os.remove(pathname)

パスをで正規化abspathし、ターゲットディレクトリと比較することで、「../../../etc/passwd」などのファイル名を回避できます。

于 2010-02-16T08:37:54.147 に答える
17

os.remove()あなたが試みているものよりもはるかに危険性が低いので、代わりに使用することを検討するかもしれません.

于 2010-02-16T08:31:35.680 に答える
6

まず、そのような作業にはos.remove()and関数を使用することをお勧めします。os.rmdir()最終的には、コードの移植性が向上し、コマンドの戻り値をチェックするための頭痛の種が少なくなります。

効果的に削除しようとしているものを確認するには (「/」だけを確認したくない場合があります)、生成されたパスでいくつかの正規表現を使用するか、データベースから返されたすべてのパスにベース パスを追加することができます (あなたが何をしているかによって異なります)。している...)。

于 2010-02-16T08:37:15.070 に答える
3

shutil.rmtreeデイブカービーが言うように使用してください。ファイルだけを削除したい場合は、以下を使用してください。

dir = "/some/path/" 
file = "somefile.txt" 
cmd = os.path.join(dir, file) 
shutil.rmtree(cmd) 

ディレクトリを削除する場合は、次を使用します。

dir = "/some/path/" 
file = "somefile.txt"  
shutil.rmtree(dir) 

ファイルが書き込み保護されている場合は、これを実行する前に書き込み権限があることを確認してください。

于 2010-02-16T09:03:36.653 に答える
2

shutilシェルのようなファイル操作を提供するというモジュールがあります。ディレクトリとその中のすべてのファイルとディレクトリを削除する場合は、を使用しますshutil.rmtree

ただし、Pythonで実装されているため、大量のファイルを削除する場合は、rmの生成が高速になる可能性がありますが、パスにスペースが含まれていると失敗します。

于 2010-02-16T08:41:20.587 に答える
1

あなたの言及rm -rfがランダムではなく、まさに必要なコマンドであると仮定すると、それを呼び出すだけではないのはなぜですか? shと呼ばれるシェルとのより優れた統合を可能にする lib があります。

from sh import rm

path_to_delete = '/some/path'
if os.path.exists(path_to_delete):
    rm('-rf', path_to_delete)

PS root でないことを確認するか、ユーザー入力に特に注意するように依頼してください。そして、はい、単一のファイルを再帰的に削除するのを避けるために男を吸ってください;)

于 2013-03-04T22:28:08.893 に答える