必要なファイルを確実に削除したい。私は次のようなコードを持っています
dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)
dir
とのfile
値はデータベースから取得されます。実行しないようにするにはどうすればよいrm -rf /
ですか?
行う前に確認すべきことは何rm -rf
ですか?
必要なファイルを確実に削除したい。私は次のようなコードを持っています
dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)
dir
とのfile
値はデータベースから取得されます。実行しないようにするにはどうすればよいrm -rf /
ですか?
行う前に確認すべきことは何rm -rf
ですか?
-r
1つのファイルを削除するだけの場合は、スイッチを使用しないでください。また、ファイル名にスペースが含まれている可能性があります。
代わりに、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」などのファイル名を回避できます。
os.remove()
あなたが試みているものよりもはるかに危険性が低いので、代わりに使用することを検討するかもしれません.
まず、そのような作業にはos.remove()
and関数を使用することをお勧めします。os.rmdir()
最終的には、コードの移植性が向上し、コマンドの戻り値をチェックするための頭痛の種が少なくなります。
効果的に削除しようとしているものを確認するには (「/」だけを確認したくない場合があります)、生成されたパスでいくつかの正規表現を使用するか、データベースから返されたすべてのパスにベース パスを追加することができます (あなたが何をしているかによって異なります)。している...)。
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)
ファイルが書き込み保護されている場合は、これを実行する前に書き込み権限があることを確認してください。
shutil
シェルのようなファイル操作を提供するというモジュールがあります。ディレクトリとその中のすべてのファイルとディレクトリを削除する場合は、を使用しますshutil.rmtree
。
ただし、Pythonで実装されているため、大量のファイルを削除する場合は、rmの生成が高速になる可能性がありますが、パスにスペースが含まれていると失敗します。
あなたの言及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 でないことを確認するか、ユーザー入力に特に注意するように依頼してください。そして、はい、単一のファイルを再帰的に削除するのを避けるために男を吸ってください;)