GNU/Linux >> Linux Esercitazione >  >> Linux

Come confrontare due cartelle e copiare la differenza in una terza cartella?

Hai tre cartelle:

  • cartella corrente , che contiene i tuoi file attuali
  • cartella vecchia , che contiene una versione precedente degli stessi file
  • cartella differenza , che è solo una cartella vuota

Come si confronta il vecchio con corrente e copia i file che sono diversi (o completamente nuovi) in corrente alla differenza ?

Ho cercato dappertutto e sembra una cosa semplice da affrontare, ma non riesco a farlo funzionare nel mio esempio particolare. La maggior parte delle fonti ha suggerito l'uso di rsync quindi ho finito con il seguente comando:

rsync -ac --compare-dest=../old/ new/ difference/

Ciò che fa, tuttavia, è copiare tutti i file da nuovo alla differenza , anche quelli che sono gli stessi di vecchio .

Nel caso in cui aiuta (forse il comando va bene e l'errore è altrove), ecco come ho testato questo:

  1. Ho creato le tre cartelle.
  2. Ho creato diversi file di testo con contenuti diversi in vecchio .
  3. Ho copiato i file dal vecchio a nuovo .
  4. Ho modificato il contenuto di alcuni file in nuovo e aggiunto alcuni file aggiuntivi.
  5. Ho eseguito il comando precedente e ho verificato i risultati in differenza .

Ho cercato una soluzione negli ultimi due giorni e apprezzerei davvero un aiuto. Non deve necessariamente usare rsync, ma vorrei sapere cosa sto sbagliando, se possibile.

Risposta accettata:

Non sono sicuro che tu possa farlo con qualsiasi comando Linux esistente come rsync o diff. Ma nel mio caso ho dovuto scrivere il mio script usando Python, poiché python ha il modulo "filecmp" per il confronto dei file. Ho pubblicato l'intero script e l'utilizzo nel mio sito personale – http://linuxfreelancer.com/

Il suo utilizzo è semplice:assegnagli il percorso assoluto della nuova directory, della vecchia directory e della directory delle differenze in quest'ordine.

#!/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. Rimuovere file e cartelle nel terminale Linux

  2. Come aprire e chiudere le directory nel terminale Linux

  3. Problema di scripting Bash:confrontare due elenchi e crearne un terzo?

  4. Come scrivere il percorso di una cartella con spazio nel suo nome??

  5. Qual è la differenza tra COPIA e AGGIUNGI in Dockerfiles?

Come eseguire il backup di file e cartelle in Debian 10

Come vedere file e cartelle nascosti in Debian

Come comprimere file e cartelle in Linux [Suggerimento per principianti]

Come comprimere la cartella su Linux

Come creare nuove cartelle nel File Manager?

Come comprimere file e cartelle in Linux