GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo comparar dos carpetas y copiar la diferencia en una tercera carpeta?

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:

  1. Hice las tres carpetas.
  2. Hice varios archivos de texto con diferentes contenidos en antiguo .
  3. Copié los archivos de antiguo a nuevo .
  4. Cambié el contenido de algunos de los archivos en nuevo y agregó algunos archivos adicionales.
  5. 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()

Linux
  1. Eliminar archivos y carpetas en la terminal de Linux

  2. Cómo abrir y cerrar directorios en la terminal de Linux

  3. ¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

  4. ¿Cuál es la diferencia entre COPIAR y AÑADIR en Dockerfiles?

  5. ¿Cómo puedo copiar una carpeta desde la línea de comandos de Linux?

Cómo hacer una copia de seguridad de archivos y carpetas en Debian 10

Cómo ver archivos y carpetas ocultos en Debian

Cómo comprimir archivos y carpetas en Linux [Consejo para principiantes]

Cómo comprimir una carpeta en Linux

¿Cómo crear nuevas carpetas en el Administrador de archivos?

Cómo comprimir archivos y carpetas en Linux