我想确保删除所需的文件。 我的代码类似于
dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)
从数据库中提取dir
和file
值。如何确保我永远不会运行rm -rf /
?
在rm -rf
之前我应该检查什么?
答案 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用户和/或要求用户输入要格外小心。 并且,是的,吸烟该男子以避免递归删除单个文件;)