17

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

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

dirfile值是从数据库中获取的。我怎样才能确保我永远不会跑步rm -rf /

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

4

6 回答 6

30

-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”或类似的文件名。

于 2010-02-16T08:37:54.147 回答
17

您可能会考虑os.remove()改用它,因为它比您尝试的危险要小得多。

于 2010-02-16T08:31:35.680 回答
6

首先,我建议您使用os.remove()andos.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提供类似 shell 的文件操作的模块。如果要删除目录以及其中的所有文件和目录,请使用shutil.rmtree.

但是它是在 python 中实现的,因此如果您要删除大量文件,则生成 rm 可能会更快,但如果路径中有空格,则会失败。

于 2010-02-16T08:41:20.587 回答
1

假设您提到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 和/或要求用户输入要格外小心。而且,是的,抽人烟以避免递归删除单个文件;)

于 2013-03-04T22:28:08.893 回答