Tienes tres carpetas:
- carpeta actual , que contiene sus archivos actuales
- carpeta antigua , que contiene una versión anterior de los mismos archivos
- carpeta diferencia , que es solo una carpeta vacía
¿Cómo se comparan los antiguos con actual y copie los archivos que son diferentes (o completamente nuevos) en actual a diferencia ?
He buscado por todas partes y parece algo simple de abordar, pero no puedo hacer que funcione en mi ejemplo particular. La mayoría de las fuentes sugirieron el uso de rsync así que terminé con el siguiente comando:
rsync -ac --compare-dest=../old/ new/ difference/
Sin embargo, lo que hace es copiar todos los archivos de nuevo a diferencia , incluso aquellos que son los mismos que en antiguo .
En caso de que ayude (tal vez el comando esté bien y la falla esté en otra parte), así es como probé esto:
- Hice las tres carpetas.
- Hice varios archivos de texto con diferentes contenidos en antiguo .
- Copié los archivos de antiguo a nuevo .
- Cambié el contenido de algunos de los archivos en nuevo y agregó algunos archivos adicionales.
- Ejecuté el comando anterior y verifiqué los resultados en diferencia .
He estado buscando una solución durante los últimos días y realmente agradecería algo de ayuda. No necesariamente tiene que usar rsync, pero me gustaría saber qué estoy haciendo mal si es posible.
Respuesta aceptada:
No estoy seguro de si puede hacerlo con los comandos de Linux existentes, como rsync o diff. Pero en mi caso tuve que escribir mi propio script usando Python, ya que Python tiene el módulo "filecmp" para comparar archivos. He publicado el script completo y su uso en mi sitio personal:http://linuxfreelancer.com/
Su uso es simple:déle la ruta absoluta del directorio nuevo, el directorio anterior y el directorio diferente en ese orden.
#!/usr/bin/env python
import os, sys
import filecmp
import re
from distutils import dir_util
import shutil
holderlist = []
def compareme(dir1, dir2):
dircomp = filecmp.dircmp(dir1, dir2)
only_in_one = dircomp.left_only
diff_in_one = dircomp.diff_files
dirpath = os.path.abspath(dir1)
[holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_one]
[holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_one]
if len(dircomp.common_dirs) > 0:
for item in dircomp.common_dirs:
compareme(
os.path.abspath(os.path.join(dir1, item)),
os.path.abspath(os.path.join(dir2, item)),
)
return holderlist
def main():
if len(sys.argv) > 3:
dir1 = sys.argv[1]
dir2 = sys.argv[2]
dir3 = sys.argv[3]
else:
print "Usage: ", sys.argv[0], "currentdir olddir difference"
sys.exit(1)
if not dir3.endswith("/"):
dir3 = dir3 + "/"
source_files = compareme(dir1, dir2)
dir1 = os.path.abspath(dir1)
dir3 = os.path.abspath(dir3)
destination_files = []
new_dirs_create = []
for item in source_files:
destination_files.append(re.sub(dir1, dir3, item))
for item in destination_files:
new_dirs_create.append(os.path.split(item)[0])
for mydir in set(new_dirs_create):
if not os.path.exists(mydir):
os.makedirs(mydir)
# copy pair
copy_pair = zip(source_files, destination_files)
for item in copy_pair:
if os.path.isfile(item[0]):
shutil.copyfile(item[0], item[1])
if __name__ == "__main__":
main()