删除目录,是不是在蟒蛇

问题描述:

空的,所以,我需要清理的目录不为空。 我已经创建了如下function.For测试的原因我想删除JDK安装删除目录,是不是在蟒蛇

def clean_dir(location): 
    fileList = os.listdir(location) 

    for fileName in fileList: 
     fullpath=os.path.join(location, fileName) 
     if os.path.isfile(fullpath): 
      os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) 
      os.remove(location + "/" + fileName) 
     elif os.path.isdir(fullpath): 
      if len(os.listdir(fullpath)) > 0: 
       clean_dir(fullpath) 
      #os.rmdir(location + "/" + fileName) 
      shutil.rmtree(location + "/" + fileName) 

    return 

我试图用rmtree和rmdir,但它失败。

我得到了使用rmtree的错误是:

OSError: Cannot call rmtree on a symbolic link

这是当我用命令rmdir我得到了错误:

OSError: [Errno 66] Directory not empty: '/tmp/jdk1.8.0_25/jre/lib/amd64/server'

代码正常的窗口。但由于某种原因,它在Linux上失败。

+0

你在一个符号链接,而不是一个目录指向rmtree。 https://en.wikipedia.org/wiki/Symbolic_link – iScrE4m

+0

如果它是一个符号链接,我想'os.unlink(...)'是你所需要的。 (为了澄清,这将只是删除符号链接。它不会删除任何符号链接指向的内容。) – smarx

+0

IIRC,'os.unlink'应该删除的文件。 – kronenpj

kronenpj感谢,认为他的想法。但是当你有一个符号链接的时候,它试图删除是一个正常的文件并且失败。我不得不添加一个新的elif并添加取消链接选项符号链接

 
def clean_dir(location): 
    fileList = os.listdir(location)

for fileName in fileList: fullpath=os.path.join(location, fileName) if os.path.isfile(fullpath): os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) os.remove(os.path.join(location, fileName)) elif os.path.islink(fullpath): os.unlink(fullpath) elif os.path.isdir(fullpath): if len(os.listdir(fullpath)) > 0: clean_dir(fullpath) #os.rmdir(location + "/" + fileName) shutil.rmtree(os.path.join(location, fileName)) return

+0

绝对正确,我不确定是否remove()会正确处理符号链接。 – kronenpj

您遇到的方式在Windows和Linux(UNIX真)处理的文件系统之间的区别之一。我相信,增加一个额外的情况下,以您的代码将至少帮助:

... 
for fileName in fileList: 
    fullpath = os.path.join(location, fileName) 
    ## |<-- Handle symlink -->| 
    if os.path.islink(fullpath) or os.path.isfile(fullpath): 
     os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) 
     os.remove(os.path.join(location, fileName)) 
    elif os.path.isdir(fullpath): 
     if len(os.listdir(fullpath)) > 0: 
      clean_dir(fullpath) 
     #os.rmdir(os.path.join(location, fileName)) 
     shutil.rmtree(os.path.join(location, fileName)) 
... 

这应该妥善处理好其中的条目是一个符号链接的情况下,将其取下就像一个文件。我不知道该chmod是必要的 - 它可能工作在链接的目标,但它不应该伤害来处理它的方式与文件相同。

但是,我只是检查并且os.path.file针对符号链接返回指向的“事物”的类型,因此需要额外的检查来区分链接本身和指向的事物。同样为了便于携带,而不是追加“/”,如上面新编辑的那样使用os.path.join