2011-02-16 75 views
2

我們需要一個腳本來比較文件的兩個目錄,並且對於在目錄1和目錄2(已添加,刪除,修改)之間進行了更改的每個文件,都需要創建只有這些已修改文件的子集。如何比較目錄以確定哪些文件已更改?

我的第一印象是創建一個python腳本來遍歷每個目錄,計算每個文件的散列,如果散列已更改,請將文件複製到新的文件子集。這是一個合適的方法嗎?我是否忽略了可能已經做到這一點的任何工具?我從來沒有用過它,但也許可以使用類似rsync的東西?

感謝

編輯:

最重要的部分是,我能夠編譯的只有那些文件被changed--這樣的一個子集,如果只有3個文件已更改版本之間,我只需要將這三個文件複製到一個新的目錄中...

+0

這些項目是源代碼管理? – orangepips 2011-02-22 04:36:32

+0

不,它們是從我們的構建中輸出的。 – Cuga 2011-02-23 14:25:10

回答

2

這是一種完全合理的方法,但您基本上是在重新創建rsync。所以是的,使用rsync。

編輯There's a way to create "difference-only" folders using rsync

+0

直到10分鐘前,我還沒有聽說過rsync,所以我不確定它是否符合我們需要的目的,但在您的評論和更多的研究後,它可能會。謝謝。 – Cuga 2011-02-16 20:52:07

+0

想一想,我相信我在解釋問題上做得不好。我真正想要實現的目錄只包含那些已更改的文件... – Cuga 2011-02-16 21:05:22

0

我喜歡diffmerge,它用於此目的的偉大工程。

3

在我看來,你需要這麼簡單的東西:

from os.path import getmtime 
from os import sep,listdir 

rep1 = 'I:\\dada' 
rep2 = 'I:\\didi' 

R1 = listdir(rep1) 
R2 = listdir(rep2) 


vanished = [ filename for filename in R1 if filename not in R2] 
appeared = [ filename for filename in R2 if filename not in R1] 
modified = [ filename for filename in (f for f in R2 if f in R1) 
      if getmtime(rep1+sep+filename)!=getmtime(rep2+sep+filename)] 


print 'vanished==',vanished 
print 'appeared==',appeared 
print 'modified==',modified 
0

我已經修改@eyquem回答了一下!對修改時間基礎類:

參數可以作爲

蟒蛇file.py DIR1 DIR2

注意!

#!/usr/bin/python 
import os, sys,time 
from os.path import getmtime 
from os import sep,listdir 

ORIG_DIR = sys.argv[1]#orig:-->/root/backup.FPSS/bin/httpd 
MODIFIED_DIR = sys.argv[2]#modified-->/FPSS/httpd/bin/httpd 

LIST_OF_FILES_IN_ORIG_DIR = listdir(ORIG_DIR) 
LIST_OF_FILES_IN_MODIFIED_DIR = listdir(MODIFIED_DIR) 


vanished = [ filename for filename in LIST_OF_FILES_IN_ORIG_DIR if filename not in LIST_OF_FILES_IN_MODIFIED_DIR] 
appeared = [ filename for filename in LIST_OF_FILES_IN_MODIFIED_DIR if filename not in LIST_OF_FILES_IN_ORIG_DIR] 
modified = [ filename for filename in (f for f in LIST_OF_FILES_IN_MODIFIED_DIR if f in LIST_OF_FILES_IN_ORIG_DIR) if getmtime(ORIG_DIR+sep+filename)<getmtime(MODIFIED_DIR+sep+filename)] 
same = [ filename for filename in (f for f in LIST_OF_FILES_IN_MODIFIED_DIR if f in LIST_OF_FILES_IN_ORIG_DIR) if getmtime(ORIG_DIR+sep+filename)>=getmtime(MODIFIED_DIR+sep+filename)] 

def print_list(arg): 
    for f in arg: 
     print '----->',f 
    print 'Total :: ',len(arg) 

print '###################################################################################################' 
print 'Files which have Vanished from MOD: ',MODIFIED_DIR,' but still present ',ORIG_DIR,' ==>\n',print_list(vanished) 
print '-----------------------------------------------------------------------------------------------------' 
print 'Files which are Appearing in MOD: ',MODIFIED_DIR,' but not present ',ORIG_DIR,' ==>\n',print_list(appeared) 
print '-----------------------------------------------------------------------------------------------------' 
print 'Files in MOD: ',MODIFIED_DIR,' which are MODIFIED if compared to ORIG: ',ORIG_DIR,' ==>\n',print_list(modified) 
print '-----------------------------------------------------------------------------------------------------' 
print 'Files in MOD: ',MODIFIED_DIR,' which are NOT modified if compared to ORIG: ',ORIG_DIR,' ==>\n',print_list(same) 
print '###################################################################################################' 
相關問題