Python脚本删除旧SVN文件权限不足

4 投票
2 回答
2688 浏览
提问于 2025-04-15 23:49

我正在尝试从目录树中删除旧的SVN文件。使用 shutil.rmtreeos.unlink 时出现了 WindowsError 错误,因为脚本没有权限去删除这些文件。我该怎么解决这个问题呢?

这是我的脚本:

# 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)

没有一个文件能够被删除。我哪里做错了呢?

2 个回答

7

为了递归地删除所有的 .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)
4

Subversion 通常会把所有的 .svn 文件夹(以及里面的所有东西)设置为只读。这意味着你可能需要先去掉这种只读保护,才能删除这些文件。

我不太确定在 Windows 上怎么最好地做到这一点,但你可以试着用 os.chmod() 这个方法,配合 stat.S_IWRITE 这个标志。你可能需要逐个检查 .svn 文件夹里的所有文件,把它们都设置为可写。

撰写回答