Basado en el guión de Chris Down, este guión es un poco más "visual". Llamándola con dos argumentos folder1
y folder2
, camina la primera carpeta y para cada archivo busca un archivo correspondiente en la segunda carpeta. Si se encuentra, la ruta relativa se imprime en verde, si tienen un tiempo o tamaño modificado diferente, se imprime en amarillo y, si no se encuentra, se imprime en rojo.
#!/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])
Tenga en cuenta que esto no es suficiente para decidir si las dos carpetas son iguales, deberá ejecutarlo en ambos sentidos para asegurarse. En la práctica, si solo quieres saber si las carpetas son iguales , entonces el script de Chris es mejor. Si desea saber lo que falta o es diferente de una carpeta a otra , entonces mi script le dirá.
NOTA: necesitará instalado termcolor, pip install termcolor
.
source/
ytarget/
también son muy importantes! (Sin ellos, comparará los nombres de los directorios de origen y destino junto con los nombres de los archivos secundarios, por lo que todos los nombres de los archivos serán diferentes)