GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie vergleiche ich zwei Ordner und kopiere den Unterschied in einen dritten Ordner?

Sie haben drei Ordner:

  • Ordner aktuell , die Ihre aktuellen Dateien enthält
  • Ordner alt , die eine ältere Version derselben Dateien enthält
  • Ordner Unterschied , was nur ein leerer Ordner ist

Wie vergleicht man alt mit Strom und kopieren Sie die Dateien, die anders (oder ganz neu) sind, in aktuell zum Unterschied ?

Ich habe überall gesucht und es scheint eine einfache Sache zu sein, aber ich kann es in meinem speziellen Beispiel nicht zum Laufen bringen. Die meisten Quellen schlugen die Verwendung von rsync vor so endete ich mit dem folgenden Befehl:

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

Dies kopiert jedoch alle Dateien von neu zum Unterschied , sogar diejenigen, die dieselben sind wie in alt .

Falls es hilft (vielleicht ist der Befehl in Ordnung und der Fehler liegt woanders), so habe ich das getestet:

  1. Ich habe die drei Ordner erstellt.
  2. Ich habe mehrere Textdateien mit unterschiedlichen Inhalten in alt erstellt .
  3. Ich habe die Dateien von alt kopiert zu neu .
  4. Ich habe den Inhalt einiger Dateien in neu geändert und ein paar zusätzliche Dateien hinzugefügt.
  5. Ich habe den obigen Befehl ausgeführt und die Ergebnisse im Unterschied überprüft .

Ich habe in den letzten Tagen nach einer Lösung gesucht und würde mich sehr über Hilfe freuen. Es muss nicht unbedingt rsync sein, aber ich würde gerne wissen, was ich falsch mache, wenn möglich.

Akzeptierte Antwort:

Ich bin mir nicht sicher, ob Sie dies mit vorhandenen Linux-Befehlen wie rsync oder diff tun können. Aber in meinem Fall musste ich mein eigenes Skript mit Python schreiben, da Python das „filecmp“-Modul für den Dateivergleich hat. Ich habe das gesamte Skript und die Verwendung auf meiner persönlichen Website gepostet – http://linuxfreelancer.com/

Die Verwendung ist einfach – geben Sie den absoluten Pfad des neuen Verzeichnisses, des alten Verzeichnisses und des Differenzverzeichnisses in dieser Reihenfolge an.

#!/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. Entfernen Sie Dateien und Ordner im Linux-Terminal

  2. So öffnen und schließen Sie Verzeichnisse im Linux-Terminal

  3. Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

  4. Wie schreibt man den Pfad eines Ordners mit Leerzeichen im Namen?

  5. Wie kopiert man den Pfad des aktuellen Verzeichnisses in Ubuntu 18.04?

So sichern Sie Dateien und Ordner in Debian 10

So sehen Sie versteckte Dateien und Ordner in Debian

So zippen Sie Dateien und Ordner in Linux [Anfängertipp]

So komprimieren Sie Ordner unter Linux

Wie erstelle ich neue Ordner im Dateimanager?

So komprimieren Sie Dateien und Ordner unter Linux