我想确保我删除了所需的文件。我有类似的代码
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
如果您只想删除单个文件,请不要使用该开关。此外,文件名中可能有空格。
更好地使用 Pythonos
模块中的函数:
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()
andos.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
提供类似 shell 的文件操作的模块。如果要删除目录以及其中的所有文件和目录,请使用shutil.rmtree
.
但是它是在 python 中实现的,因此如果您要删除大量文件,则生成 rm 可能会更快,但如果路径中有空格,则会失败。
假设您提到rm -rf不仅仅是随机的,而是您需要的命令,为什么不直接调用它呢?有一个库允许与称为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 和/或要求用户输入要格外小心。而且,是的,抽人烟以避免递归删除单个文件;)