Dựa trên kịch bản của Chris Down, kịch bản này có phần "trực quan" hơn một chút. Gọi nó với hai đối số folder1
và folder2
, nó đi qua thư mục đầu tiên và cho mỗi tệp tìm kiếm một tệp tương ứng trong thư mục thứ hai. Nếu nó được tìm thấy, đường dẫn tương đối được in màu xanh lá cây, nếu chúng có thời gian hoặc kích thước được sửa đổi khác nhau, nó được in màu vàng và nếu không tìm thấy thì nó được in màu đỏ.
#!/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])
Lưu ý rằng điều này là không đủ để quyết định xem hai thư mục có giống nhau hay không, bạn sẽ cần chạy cả hai cách để đảm bảo. Trong thực tế nếu bạn chỉ muốn biết liệu các thư mục có giống nhau hay không , thì kịch bản của Chris sẽ tốt hơn. Nếu bạn muốn biết những gì còn thiếu hoặc khác nhau từ thư mục này sang thư mục khác , thì tập lệnh của tôi sẽ cho bạn biết.
LƯU Ý: bạn sẽ cần cài đặt termcolor , pip install termcolor
.
source/
vàtarget/
cả hai đều rất quan trọng! (Không có chúng, bạn sẽ so sánh tên thư mục nguồn và đích cùng với tên tệp con, vì vậy tất cả các tên tệp sẽ khác nhau.)