2010-02-15 32 views
5

我是一個python新手,我正在編寫一個腳本來將編譯好的文件從一個位置複製到另一個位置。我目前所面對的是非常簡單的,像這樣:我們可以在Python中做一個智能副本嗎?

import os 
import shutil 

shutil.copy2 (src, dst) 
#... many more shutil.copy commands 
#src is a filename string 
#dst is the directory where the file is to be copied 

我的問題是,許多文件被複制是較大的文件,而不是所有的人都重新編譯每個編譯循環。理想情況下,我只想複製此腳本中已更改的文件。有什麼辦法可以做到這一點?

回答

9

你可以使用的文件的修改時間,如果這足以讓你:

# If more than 1 second difference 
if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1: 
    shutil.copy2 (src, dst) 

或致電同步像rsync這樣的工具。

+3

爲什麼'> 1' - 應該說不是'> 0'? – Wikis 2014-09-24 08:33:04

+0

取決於用例,我想。如果文件總是使用'shutil.copy2'寫入,那麼修改時間可以預期完全相等(然後是'> 0')。 – AndiDog 2014-09-24 10:49:42

4

如果你沒有明確的理由需要在Python中自己編碼,我建議使用rsync。從它的手冊頁:

Rsync是一個快速和異常 多功能文件複製工具。它是 以其delta-transfer 算法而聞名,它通過發送 源文件和 目標文件中的現有文件之間的差異來減少通過網絡發送的數據量。

如果你想用Python編寫這一點,但是,隨後開始的地方將是研究 filecmp.cmp

1

,你會怎樣想尋找更改的文件?您可以在src上使用os.path.getmtime(path),並檢查它是否比某個存儲的時間戳(例如最後一次複製時)更新,或者使用filecmp.cmp(f1,f2 [,shallow])來檢查一個文件是否更新。

小心filecmp.cmp,你也複製stat(copy2),所以你必須檢查一個淺的比較是否足夠適合你。

1

從AndiDog的回答是:

os.stat(dst).st_mtime - os.stat(src).st_mtime 

是一個負值,如果「src」中的文件是新的,所以它應該是:

if os.stat(src).st_mtime - os.stat(dst).st_mtime > 1: 
0

要建立在AndiDog的答案,如果你遇到的問題可能無法在目標文件夾中的文件:

# copy file if destination is older by more than a second, or does not exist 
if (not os.path.exists(dest)) or (os.stat(src).st_mtime - os.stat(dest).st_mtime > 1) : 
    shutil.copy2 (src, dest) 
相關問題