2010-06-11 50 views
1

我有一個曾經在SVN下的項目,但現在我將它移動到Mercurial,所以我想清除所有.svn文件。Python:用小腳本刪除文件的問題

手工操作有點太大,所以我決定寫一個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聲明的註釋,則所有文件管理器都將被「考慮」。爲什麼是這樣?

還是有一些其他實用程序已經存在遞歸去SVN - 如果目錄樹?

回答

4

至少你不應該重新發明遞歸目錄遍歷的輪子,而只是使用os.walk

+0

哦謝謝我不知道這個功能存在。 – 2010-06-11 02:50:21

+0

解決了這個問題,但我不明白爲什麼。 – 2010-06-11 03:02:50

2

這並不回答你的Python問題,但有一個更簡單的方法來做你想做的事情:svn export會將你的文件樹寫入一些沒有所有.svn目錄的新文件。

+0

不錯。如果我已經手動刪除了一些svn文件和/或以其他方式毀壞了目錄結構? – 2010-06-11 03:05:40

+0

@Rosarch:您可以直接從SVN網址導出,例如。 'svn export svn:// server/repo/trunk myproject' – 2010-06-11 03:22:55

1

原因'繼續'顯示所有正在考慮的文件夾是因爲exit()函數結束時被調用。在第一個目錄被搜索後,對exit()的調用將退出Python。如果你將它改爲'return',你的函數將被遞歸地調用。

另外os.listdir不返回'。'或'..',所以你不需要檢查或任何繼續聲明。

:-)

戴維

0

我曾經是SVN下的一個項目,但我現在移動它善變,所以我想清除所有的.svn文件文件。

不要這裏邊步驟你的問題(我知道它已經回答了,沒有正確的少),但如果你想你的源從水銀出口,你應該使用SVN的「export」命令你不需要手動(或實用主義)刪除所有.svn目錄的....

(這主要是針對想出這個帖子尋找如何做到這一點別人的)

而且,有SVN Mercurial進口商....