2011-10-21 56 views
2

腳本我寫信是爲了單獨日的目錄從原來的位置移到新的位置,這樣的結構:的Python shutil.move:奇softlinking

/old/YYYY/MM/DD 
/new/YYYY/MM/DD 

和另一項任務(無關移動數據的)我喜歡這個新位置創建一個符號鏈接(這是我犯了第一個錯誤):

/new/2011/09 -> /old/2011/09 

我的劇本必要使用此函數調用:

for d in os.listdir("/old/2011/09"): 
    shutil.move(os.path.join("/old/2011/09/", d), os.path.join("/new/2011/09", d)) 

運行我的腳本2011/09後兩者都是空的。我曾發生這種情況與未歸檔的數據一起工作...大問題。 我的問題是爲什麼沒有shutil.move()給我一個錯誤,我移動的日子目錄已經存在了?由於軟鏈接,09內的每一天都應該是同一個目錄。

/new/2011/09/01 == /old/2011/09/01 

不將shutil.move調用檢查調用shutil.copy2前的源和目的?從文檔:「目標目錄不能已經存在。」或者只有當它使用重命名時如果它有所作爲,舊的和新的位置都是glusterfs。

shutil.move Documentation

shutil.copy Documentation

感謝任何清晰,你可以提供。

編輯/更新:我向python-list提交了一個問題,詢問爲什麼這種行爲存在並詢問是否應該更改(list archive)。他們建議我提交一份錯誤報告。在進行測試來提交bug時,我發現這已經在Python 2.7中修復了。您可以在移動函數聲明中看到源文件中的差異:Python 2.6Python 2.7

這仍然做移動/重命名,但不會奇蹟般地刪除整個目錄。

+0

'如果目標已經存在但不是目錄,則可能會根據os.rename()語義覆蓋它。「似乎您必須檢查文件是否存在。 – Griffin

回答

1

歸結到一點,這兩條線在shutil.move

 copytree(src, real_dst, symlinks=True) 
     rmtree(src) 

其中src='old'real_dst='new/old'copytree命令將old複製到子目錄new/old。這很好,但它可能不是你想要的。

rmtree刪除old目錄。這是一個問題,因爲new現在是一個懸掛的符號鏈接。

+0

符號鏈接是月份,而不是一天。所以real_dst會變成/ new/2011/09/01/01 /這實際上是/ old/2011/09/01/01 /。因此,如果shutil.move使用realpath()而不是abspath()(在_destinsrc中),我永遠不會丟失數據......或者我可能只是沒有啞巴,並且證實我正在做我認爲我在做的事情。 – daveydave400

+0

......或者我可以在創建完整路徑時在腳本中使用實時路徑。鏈接到源代碼+1。 – daveydave400