Python:删除文件的小脚本问题

时间:2010-06-11 02:39:26

标签: python filesystems

我有一个曾经在SVN下的项目,但现在我将它移到Mercurial,所以我想清除所有.svn文件。

手动执行它有点太大了,所以我决定编写一个python脚本来完成它。但它没有用。

def cleandir(dir_path):
    print "Cleaning %s\n" % dir_path
    toDelete = []
    files = os.listdir(dir_path)
    for filedir in files:
        print "considering %s" % filedir
        # continue
        if filedir == '.' or filedir == '..':
            print "skipping %s" % filedir
            continue
        path = dir_path + os.sep + filedir
        if os.path.isdir(path):
            cleandir(path)
        else:
            print "not dir: %s" % path

        if 'svn' in filedir:
            toDelete.append(path)

    print "Files to be deleted:"
    for candidate in toDelete:
        print candidate
    print "Delete all? [y|n]"

    choice = raw_input()

    if choice == 'y':
        for filedir in toDelete:
            if os.path.isdir(filedir):
                os.rmdir(filedir)
            else:
                os.unlink(filedir)

    exit()

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

印刷声明显示它只是“考虑”名称以“。”开头的档案馆。但是,如果我取消注释continue声明,则会“考虑”所有归档。这是为什么?

或者是否存在一些已经存在的递归de-SVN-ify目录树的其他实用程序?

4 个答案:

答案 0 :(得分:4)

至少你不应该重新发明轮子以进行递归目录遍历,只需使用os.walk

答案 1 :(得分:2)

这不能回答你的Python问题,但有一种更简单的方法可以做你想做的事情:svn export会把你的文件树写成一些没有所有.svn目录的新文件。

答案 2 :(得分:1)

'continue'的原因显示正在考虑的所有文件夹是因为在函数末尾调用了exit()。在搜索到第一个目录后,对exit()的调用将退出Python。如果将其更改为“return”,则将递归调用函数。

os.listdir也不会返回'。'或'..'所以你不需要支票或任何继续陈述。

: - )

戴维

答案 3 :(得分:0)

  

我有一个曾经在SVN下的项目,但现在我将它移到Mercurial,所以我想清除所有的.svn文件。

不要在这里提出你的问题(我知道它已被正确回答)但是如果你想从Mercurial导出你的源代码,你应该使用SVN的'export'命令... 。您不需要手动(或实际)删除所有.svn文件夹....

(这主要是针对其他人发布的这篇文章,看看如何做到这一点)

此外,Mercurial进口商还有SVN ....