Основанный на сценарии Криса Дауна, этот сценарий немного более «визуален». Назвав его с двумя аргументами 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/
также оба очень важны! (Без них вы будете сравнивать имена исходных и целевых каталогов с именами дочерних файлов, поэтому все имена файлов будут отличаться.)