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:
- Ich habe die drei Ordner erstellt.
- Ich habe mehrere Textdateien mit unterschiedlichen Inhalten in alt erstellt .
- Ich habe die Dateien von alt kopiert zu neu .
- Ich habe den Inhalt einiger Dateien in neu geändert und ein paar zusätzliche Dateien hinzugefügt.
- 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()