Python脚本删除旧SVN文件权限不足
我正在尝试从目录树中删除旧的SVN文件。使用 shutil.rmtree
和 os.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
文件夹里的所有文件,把它们都设置为可写。