【问题标题】:Python script to delete old SVN files lacks permission删除旧 SVN 文件的 Python 脚本缺少权限
【发布时间】:2010-06-11 03:05:02
【问题描述】:

我正在尝试从目录树中删除旧的 SVN 文件。 shutil.rmtreeos.unlink raise WindowsErrors,因为脚本没有删除它们的权限。我怎样才能解决这个问题?

这是脚本:

# Delete all files of a certain type from a direcotry

import os
import shutil

dir = "c:\\"

verbosity = 0;

def printCleanMsg(dir_path):
    if verbosity:
        print "Cleaning %s\n" % dir_path

def cleandir(dir_path):
    printCleanMsg(dir_path)
    toDelete = []
    dirwalk = os.walk(dir_path)
    for root, dirs, files in dirwalk:
        printCleanMsg(root)
        toDelete.extend([root + os.sep + dir for dir in dirs if '.svn' == dir])
        toDelete.extend([root + os.sep + file for file in files if 'svn' in file])

    print "Items to be deleted:"
    for candidate in toDelete:
        print candidate
    print "Delete all %d items? [y|n]" % len(toDelete)

    choice = raw_input()

    if choice == 'y':
        deleted = 0
        for filedir in toDelete:
            if os.path.exists(filedir): # could have been deleted already by rmtree
                try:
                    if os.path.isdir(filedir):
                        shutil.rmtree(filedir)
                    else:
                        os.unlink(filedir)
                    deleted += 1
                except WindowsError:
                    print "WindowsError: Couldn't delete '%s'" % filedir

    print "\nDeleted %d/%d files." % (deleted, len(toDelete))
    exit()

if __name__ == "__main__":
    cleandir(dir)

没有一个文件可以被删除。我做错了什么?

【问题讨论】:

  • 只是为了掩盖显而易见的问题:您确定这是权限问题吗?
  • 是的。它说:WindowsError: [Error 5] Access is denied: 'dir'

标签: python permissions filesystems


【解决方案1】:

为了递归删除所有 .svn,我使用了这个脚本。也许它会帮助某人。

import os, shutil, stat

def del_evenReadonly(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

for root, subFolders, files in os.walk(os.getcwd()):
    if '.svn' in subFolders:
      shutil.rmtree(root+'\.svn',onerror=del_evenReadonly)

【讨论】:

    【解决方案2】:

    Subversion 通常将所有.svn 目录(以及其中的所有内容)设为写保护。可能您必须先删除写保护才能删除文件。

    我不太确定如何在 Windows 上做到这一点,但您应该能够将 os.chmod()stat.S_IWRITE 标志一起使用。可能您必须遍历 .svn 目录中的所有文件,并使它们都可单独写入。

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2018-08-16
      • 2011-05-20
      • 2011-08-06
      相关资源
      最近更新 更多