Как сравнить каталоги, чтобы определить, какие файлы изменились? - PullRequest
2 голосов
/ 16 февраля 2011

Нам нужен скрипт, который будет сравнивать два каталога файлов, и для каждого файла, который был изменен между каталогом 1 и каталогом 2 (добавлен, удален, изменен), необходимо создать подмножество только этих измененных файлов.

Мое первое впечатление - создать скрипт на python для обхода каждого каталога, вычислить хеш каждого файла и, если хеш изменился, скопировать файл в новое подмножество файлов.Это правильный подход?Не пренебрегаю ли я какими-либо инструментами, которые уже могут это сделать?Я никогда не использовал его, но, может быть, использовать что-то вроде rsync можно использовать?

Спасибо

Редактировать:

Важным моментом является то, что я могу скомпилировать подмножество только тех файлов, которые были изменены - так что, если только 3 файла изменились между версиями, мне нужны только эти три файла, скопированные в новый каталог ...

Ответы [ 4 ]

3 голосов
/ 17 февраля 2011

Мне кажется, вам нужно нечто простое:

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
2 голосов
/ 16 февраля 2011

Это вполне разумный подход, но вы по сути заново изобретаете rsync.Так что да, используйте rsync.

edit : Существует способ создать папки "только для различий", используя rsync

0 голосов
/ 01 декабря 2017

Я изменил @ eyquem ответь немного!

Аргументы могут быть даны как

python 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 '###################################################################################################'
0 голосов
/ 16 февраля 2011

Мне нравится diffmerge , он прекрасно работает для этой цели.

...