使用rm命令删除文件

时间:2010-02-16 08:27:59

标签: python file delete-file

我想确保删除所需的文件。 我的代码类似于

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

从数据库中提取dirfile值。如何确保我永远不会运行rm -rf /

rm -rf之前我应该​​检查什么?

6 个答案:

答案 0 :(得分:26)

如果您只想删除单个文件,请不要使用-r开关。此外,文件名中可能有空格。

更好地使用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”等文件名。

答案 1 :(得分:15)

您可以考虑使用os.remove(),因为它比您尝试的更危险。

答案 2 :(得分:6)

首先,我建议您使用os.remove()os.rmdir()函数来处理类似的事情。最终会得到更多的可移植代码,并且不再需要检查命令返回。

要检查有效尝试删除的内容(您可能不想只检查“/”),可以在生成的路径上使用一些正则表达式,或者只添加从数据库返回的所有路径的基本路径(取决于你在做什么......)。

答案 3 :(得分:2)

有一个名为shutil的模块,它提供类似shell的文件操作。如果要删除目录及其中的所有文件和目录,请使用shutil.rmtree

然而它是在python中实现的,所以如果要删除大量文件,那么产生rm可能会更快,但如果路径中有空格则会失败。

答案 4 :(得分:2)

使用shutil.rmtree,如Dave Kirby所说。如果您只想删除文件,请使用:

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

如果要删除目录,请使用:

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

如果文件是写保护的,请确保在运行此文件之前具有写入权限。

答案 5 :(得分:0)

假设你提到的 rm -rf 不是随机的,而是你需要的命令,为什么不只是调用它?有一个lib允许与名为sh的shell进行更大程度的集成。

from sh import rm

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

PS确保您不是root用户和/或要求用户输入要格外小心。 并且,是的,吸烟该男子以避免递归删除单个文件;)