Wie vergleiche ich zwei Ordner rekursiv und generiere eine Liste von Dateien und Ordnern, die sich unterscheiden?

11283
Andrew Cheong

tl; dr und ein Beispiel

Ich suche nach einer Möglichkeit, zwei Ordner rekursiv zu vergleichen und die relativen Pfade aller Dateien (und Ordner) auszugeben, die sich unterscheiden (nach Größe oder nach Zeitstempel à la rsync).

Zum Beispiel sagen, ich habe

C:\source\foo\a.txt C:\source\foo\bar\b.txt C:\source\foo\bar\c.txt 

und

C:\target\foo\a.txt C:\target\foo\bar\b.txt C:\target\foo\bar\d.txt C:\target\foo\baz\ 

und angenommen b.txtwurde unter geändert C:\sourceund ist somit neuer.

Wenn Sie dann ein magisches Skript oder einen magischen Befehl erhalten, sagen wir, magic C:\source C:\targetdie Ausgabe wäre wünschenswert

foo\bar\b.txt 

Ein vollständiger Pfad für den Quell- oder den Zielordner wäre ebenfalls akzeptabel:

C:\source\foo\bar\b.txt 

Wie das Beispiel zeigt, kümmere ich mich nicht um Dateien und Ordner, die gelöscht oder erstellt wurden! Was diese Aufgabe wesentlich einfacher machen sollte als sonst.

Was ich schon weiß ...

Ich bin selbst ein Unix-Entwickler und würde nicht fragen, ob es sich um ein UNIX-System handelt, mit dem wir uns befassen, aber leider. Dies ist auch für eine benutzerdefinierte nächtliche Backup-Lösung gedacht, bei der Zuverlässigkeit und Datenintegrität Priorität haben. Angesichts der Tatsache, dass ich vor einigen Wochen noch nicht einmal eine for-Schleife in einem Batch-Skript ermitteln konnte, bin ich mir ziemlich sicher, dass mir dies fehlt die Erfahrung, dies richtig zu machen, oder sogar den besten Weg, um dies zu tun.

Beim Lesen von http://www.howtoforge.com/backing-up-with-rsync-und-managing-previous-versions-history erfuhr ich, dass Rsync etwas wie das tun kann, was ich will, und zwar mit Optionen wie

--dry-run # don't actually rsync (touch) any files --itemize-changes # list changes rsync _would_ have made --out-format="%i|%n|" # define an output format for the list of changes 

Ich würde es jedoch hassen, Cygwin (cwRsync) für die Verwendung von rsync verwenden zu müssen, da ich bereits dazu neige, schnelle und schmutzige Experimente mit meiner Cygwin-Installation auszuführen, oft die Umgebung zu brechen und Cygwin alle paar Wochen neu zu installieren. Diese Art ist gegen den "zuverlässigen" Teil eines nächtlichen Backups.

Ich habe kein "kanonisches" Tool wie rsync in Windows gefunden, zumindest keine, die Optionen wie die oben genannten unterstützen. Außerdem suche ich nicht generell nach Software, es sei denn, dies ist ein einfaches und kompaktes Werkzeug für diesen Zweck. Ich bevorzuge eine transparente, programmatische Lösung . Für etwas so Wichtiges wie das Sichern von Dateien, das Verlassen auf Software oder Code kann ich nicht sehen oder verstehen, dass es unheimlich ist!

Rekapitulieren

Ich kann mich nicht mit Batch-Scripting-Syntax beschäftigen. Als nächstes werde ich PowerShell ausprobieren. Aber was würden Sie angesichts dieser Aufgabe tun? Gibt es eine offensichtliche Route, die ich vermisse?

5
Viele Leute verwenden winmerge dafür, aber Ihre Ausgabespezifikationen werden schwer zu duplizieren sein, wenn Sie nicht selbst ein Skript erstellen. Frank Thomas vor 10 Jahren 1

2 Antworten auf die Frage

4
Andrew Cheong

@Glytzhkof empfahl Robocopy in seiner Antwort und es passte perfekt zu meinen Bedürfnissen.

tl; dr

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs  C:\source\foo\bar\b.txt 

Details und Erklärung der Optionen

Robocopy (Wikipedia) scheint für die Windows-Systemadministration weit verbreitet zu sein. ist gut dokumentiert (TechNet); wird als mehr als eine Verschleierung bezüglich Stack Overflow, Server Fault und natürlich hier bei Super User diskutiert ; sorgt für eine bestimmte Funktion, anstatt zu versuchen, ein Mehrzweckwerkzeug zu sein (das zu Aufblasen und Bugs neigt); Und außerdem stellt sie diese spezifische Funktion seit 1997 zur Verfügung. Für mich tragen all diese Faktoren zu "Transparenz" bei, obwohl sie geschlossen sind, und beruhigen mich.

Robocopy ist Teil einer Reihe von Tools, die derzeit als Windows Server 2003 Resource Kit Tools bekannt sind . Nach dem Herunterladen und Installieren habe ich das Szenario in meiner Frage neu erstellt und es versucht:

C:\>robocopy.exe source target /l /e /zb  ------------------------------------------------------------------------------- ROBOCOPY :: Robust File Copy for Windows -------------------------------------------------------------------------------  Started : Thu May 01 09:08:20 2014  Source : C:\source\ Dest : C:\target\  Files : *.*  Options : *.* /L /S /E /COPY:DAT /ZB /R:1000000 /W:30  ------------------------------------------------------------------------------  0 C:\source\ 1 C:\source\foo\ *EXTRA Dir -1 C:\target\foo\baz\ 2 C:\source\foo\bar\ *EXTRA File 1 d.txt Newer 5 b.txt New File 1 c.txt  ------------------------------------------------------------------------------  Total Copied Skipped Mismatch FAILED Extras Dirs : 3 0 3 0 0 1 Files : 3 2 1 0 0 1 Bytes : 7 6 1 0 0 1 Times : 0:00:00 0:00:00 0:00:00 0:00:00  Ended : Thu May 01 09:08:20 2014 

Sieht gut aus! Lassen Sie mich die Optionen erläutern:

  • /llistet Aktionen auf, ohne sie tatsächlich auszuführen.
  • /eSchließt Unterverzeichnisse ein, aber im Gegensatz dazu /sauch leere Verzeichnisse.
  • /zbKopien im "Neustart" -Modus und bei Zugriff verweigert, "Backup" -Modus; es scheint der sicherste Ansatz zu sein; Lesen Sie hier mehr .

Ich habe keine der kopierbezogenen Optionen benötigt, da ich eigentlich keine Aktionen durchführe.

Als nächstes mussten wir nur noch weitere Schalter hinzufügen, um die gewünschte Ausgabe zu erhalten:

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs  C:\source\foo\bar\b.txt 

Lassen Sie uns noch einmal die Optionen durchgehen.

Zunächst kümmerte ich mich nur um modifizierte Dateien und Ordner, also:

  • /xx schließt "zusätzliche" Dateien und Verzeichnisse aus, dh solche, die nur im Ziel vorhanden sind.
  • /xl schließt "einsame" Dateien und Verzeichnisse aus, die nur in der Quelle vorhanden sind.

Zweitens wollte ich relative Pfade (oder zumindest vollständige Pfade, nicht nur Namen):

  • /fp ermöglicht volle Pfade (nicht überraschend gab es keine Option für relative Pfade).

Drittens wollte ich so viel Flusen wie möglich entfernen, und ich war angenehm überrascht, als ich herausfand, dass alles entfernbar war:

  • /ns unterdrückt Dateigrößen.
  • /ncunterdrückt Klassen, z Newer .
  • /ndl unterdrückt Verzeichnisnamen.
  • /np unterdrückt die Ausgabe des Kopierfortschritts.
  • /njh unterdrückt den Auftragskopf.
  • /njs unterdrückt die Jobzusammenfassung.

Und da hast du es!


Für meine Zwecke (Erstellen von versionierten Backups geänderter Dateien) wurde mir klar, dass ich eigentlich auch gerne den Zeitstempel jeder modifizierten Datei hätte. Einfach hinzufügen /ts:

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs /ts  2014/05/01 15:20:42 C:\source\foo\bar\b.txt 
2
Stein Åsmul

Ich habe einmal ein benutzerdefiniertes Batch-gesteuertes Backup-System erstellt, bei dem ein Drittanbieter-Tool nachts neue und geänderte Dateien auf ein Backup-Laufwerk kopierte. Für mein Leben kann ich mich nicht erinnern, wie der Name dieses Tools zu diesem Zeitpunkt war. Ich könnte es vielleicht finden, aber jetzt nicht.

Beyond Compare von http://www.scootersoftware.com/ ist das beste und billigste Vergleichstool auf dem Markt - es ist zweifellos ein brillantes Werkzeug. Seine Nützlichkeit ist unmittelbar und ein Werkzeug, das alle Profis, die mit Dateien arbeiten, von jedem Tag profitieren würde. Probiere es aus . Sehen Sie einen Screenshot . Es ist eine Befehlszeilenversion enthalten .

Anders als das Robocopy.exe sollte in der Lage sein, zu erreichen, was Sie mit etwas Geduld und Tests wollen.

Noch ein Tipp: Um ein Backup-Notfall zu vermeiden, habe ich das Backup-Skript mit einem Konto mit geringen Berechtigungen ausgeführt, um zu verhindern, dass etwas gelöscht wird, wenn sich jemand mit dem Skript beschäftigt oder überhaupt Rechte hat, wenn jemand versucht, sich mit dem Skript anzumelden. Ich denke, ich habe das Konto nicht interaktiv eingestellt oder kann sich nicht interaktiv oder etwas anmelden. Sehr empfehlenswert für Batch-Ausführung unter Windows. Ich dachte nur, ich würde es erwähnen, da Sie aus der Welt von Unix kommen.

Deine Antwort ist bereits + 1. Vielen Dank! `robocopy.exe` funktioniert sehr gut! Ich hoffe, es macht Ihnen nichts aus, wenn ich meine eigene, detailliertere Antwort einstelle und akzeptiere. Andrew Cheong vor 10 Jahren 0