На основі сценарію Кріса Дауна цей сценарій є трохи більш "візуальним". Назвавши його з двома аргументами folder1
і folder2
, він проходить першу папку і для кожного файлу шукає відповідний файл у другій папці. Якщо він знайдений, відносний шлях друкується зеленим кольором, якщо вони мають різний модифікований час або розмір, він друкується жовтим кольором, а якщо його не знайдено, він друкується червоним кольором.
#!/usr/bin/env python
import os
import sys
from termcolor import colored
def compare_filestats(file1,file2):
"""
Compares modified time and size between two files.
Return:
-1 if file1 or file2 does not exist
0 if they exist and compare equal
1 if they have different modified time, but same size
2 if they have different size, but same modified time
3 if they have different size, and different modified time
"""
if not os.path.exists(file1) or not os.path.exists(file2):
return -1
stat1 = os.stat(file1)
stat2 = os.stat(file2)
return (stat1.st_mtime != stat2.st_mtime) \
+ 2*(stat1.st_size != stat2.st_size)
def compare_folders(folder1,folder2):
"""
folder1: serves as reference and will be walked through
folder2: serves as target and will be querried for each file in folder1
Prints colored status for each file in folder1:
missing: file was not found in folder2
mtime : modified time is different
size : filesize is different
ok : found with same filestats
"""
for dirpath, dirnames, filenames in os.walk(folder1):
for file1 in ( os.path.join(dirpath, x) for x in filenames ):
relpath = file1[len(folder1):]
file2 = os.path.join( folder2, relpath )
comp = compare_filestats(file1,file2)
if comp < 0:
status = colored('[missing]','red')
elif comp == 1:
status = colored('[mtime ]','yellow')
elif comp >= 2:
status = colored('[size ]','yellow')
else:
status = colored('[ok ]','green')
print status, relpath
if __name__ == '__main__':
compare_folders(sys.argv[1],sys.argv[2])
Зверніть увагу , що це НЕ досить , щоб вирішити , слід чи дві папки такі ж, вам потрібно буде запустити його в обох напрямках , щоб переконатися. На практиці, якщо ви просто хочете дізнатися, чи однакові папки , то краще сценарій Кріса. Якщо ви хочете знати, чого не вистачає чи відрізняється від однієї папки до іншої , тоді мій сценарій вам скаже.
Примітка: вам буде потрібно termcolor встановлено, pip install termcolor
.
source/
іtarget/
також дуже важливі! (Без них ви будете порівнювати імена джерел і цільових каталогів разом з іменами дочірніх файлів, тому всі назви файлів будуть відрізнятися.)