Baseado no roteiro de Chris Down, esse roteiro é um pouco mais "visual". Chamando-o com dois argumentos folder1
e folder2
, ele percorre a primeira pasta e, para cada arquivo, procura um arquivo correspondente na segunda pasta. Se for encontrado, o caminho relativo será impresso em verde, se tiverem tempo ou tamanho modificados diferentes, será impresso em amarelo e, se não for encontrado, será impresso em vermelho.
#!/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])
Observe que isso não é suficiente para decidir se as duas pastas são iguais; você precisará executá-lo nos dois sentidos para garantir. Na prática, se você quiser apenas saber se as pastas são iguais , o script de Chris é melhor. Se você quiser saber o que está faltando ou é diferente de uma pasta para outra , meu script informará.
NOTA: você precisará do termcolor instalado pip install termcolor
,.
source/
etarget/
também são muito importantes! (Sem eles, você comparará os nomes dos diretórios de origem e de destino com os nomes dos arquivos filhos, para que todos os nomes de arquivos sejam diferentes.)