Wie erstelle ich programmgesteuert mit Linux-Befehlszeilentools eine Liste der geänderten Dateien? Der Unterschied in einer bestimmten Datei (Delta, Patch) interessiert mich nicht. Ich möchte nur eine Liste neuer oder geänderter Dateien im Vergleich zur vorherigen Produktversion haben. Damit ich ein neues Produktupdate veröffentlichen kann.
Update: diff -qr
Erzeugt keine sehr praktische Ausgabe. Die Ausgabe von muss diff -qr
ebenfalls verarbeitet werden. Gibt es einen besseren Weg?
linux
bash
command-line
diff
Alpha Sisyphus
quelle
quelle
Antworten:
Ich habe dafür einen einfachen Ansatz: Benutze den rsync-Preview-Modus:
Die Dateien, die von diesem Befehl als "zu löschen" angezeigt werden, sind die "neuen" Dateien. Die anderen, die übertragen werden sollen, haben sich in gewisser Weise geändert. Weitere Informationen finden Sie auf der rsync-man-Seite.
quelle
Sie können das Diff- Tool verwenden: Siehe die Optionen -q und -r
Beispiel:
quelle
Only in
die auch dann angezeigt werden, wenn die Verzeichnisse ideale Kopien sind. Ich musste Änderungen mit einer alten Revision vergleichen und am Ende die gesamte Revision in ein separates Verzeichnis herunterladen und Standard-SVN-Tools zum Vergleichen verwenden. Dies scheint der einzige Weg zu sein…Das
diffutils
Paket enthält einlsdiff
Werkzeug.diff -u
Übergeben Sie einfach die Ausgabe von an lsdiff:quelle
patchutils
Paket für mich (CentOS 5.x).Ich würde bei jedem Update einfach eine Datei anfassen, und dann können Sie Dateien finden, die seitdem mit geändert wurden
find /tree/location -newer /last/update/file -print
quelle
Um nur den Namen der Dateien zu übernehmen, die sie geändert haben, verwende ich diesen Befehl:
Wenn Sie einige Dateien als Objektdateien oder Bibliotheksdateien ausschließen müssen, können Sie Folgendes verwenden:
quelle
Um eine Liste mit neuen oder geänderten Dateien programmgesteuert zu erstellen, ist die beste Lösung, die ich finden könnte, die Verwendung von rsync , sort und uniq :
Lassen Sie mich anhand dieses Beispiels erklären: Wir möchten zwei DokuWiki-Versionen vergleichen, um festzustellen, welche Dateien geändert und welche neu erstellt wurden.
Wir holen die Teere mit wget und extrahieren sie in die Verzeichnisse
old/
undnew/
:Wenn Sie rsync auf eine Weise ausführen, werden möglicherweise neu erstellte Dateien übersehen, wie der Vergleich von rsync und diff hier zeigt:
ergibt folgende Ausgabe:
Wenn Sie rsync nur in einer Richtung ausführen, werden die neu erstellten Dateien übersehen, und in der anderen Richtung werden gelöschte Dateien übersehen. Vergleichen Sie die Ausgabe von diff:
ergibt folgende Ausgabe:
Wenn Sie rsync in beide Richtungen ausführen und die Ausgabe sortieren, um Duplikate zu entfernen, wurde festgestellt, dass das Verzeichnis
data/pages/playground/
und die Dateidata/pages/playground/playground.txt
ursprünglich übersehen wurden:ergibt folgende Ausgabe:
rsync
wird mit diesen Argumenten ausgeführt:-r
in Verzeichnisse "rekursieren",-c
um auch Dateien mit identischer Größe zu vergleichen und nur "Überspringen basierend auf Prüfsumme, nicht Mod-Zeit & Größe",-n
"Probelauf ohne Änderungen durchführen" und--out-format="%n"
"Aktualisierungen mit dem angegebenen FORMAT ausgeben", hier "% n" nur für den DateinamenDie Ausgabe (Dateiliste)
rsync
in beiden Richtungen wird kombiniert und sortiertsort
, und diese sortierte Liste wird dann verdichtet, indem alle Duplikate mit entfernt werdenuniq
quelle
Sie sollten das gewünschte Ergebnis erhalten mit:
quelle
Dies könnte den Trick machen:
quelle
Normalerweise legen Sie die Dateien in eine Art Versionskontrollsystem wie SubVersion oder git, da diese dies für Sie sofort erledigen können.
Sie können jedoch ein schnelles Skript mit einer for-Schleife für dir1 erstellen und dann jede Datei mit der in dir2 vergleichen. Die for-Schleife kann den Exit-Code von diff überprüfen, um festzustellen, ob die Dateien unterschiedlich waren.
Vielleicht so etwas:
Hinweis: Das Skript wurde nicht getestet, daher ist das obige Beispiel "bash inspired pseudocode" ...
Lass uns noch einen Versuch machen, aber mit Schwachkopf
Erstellen Sie einige Beispieldateien zum Spielen
Geben Sie dann das Verzeichnis ein und importieren Sie das Verzeichnis 1
Geh raus und ändere dir1 (so wird es dein dir2)
Dann gehe in das Git-Verzeichnis und importiere das neue Verzeichnis
Jetzt frag git was sich geändert hat (mit dem status Befehl)
Die Ausgabe ist eine Liste mit den Änderungen, die so aussieht:
quelle
Vielleicht wären Sie mit etwas anderem glücklicher. Versuchen Sie es
git
.Tun Sie dies als Beispiel:
git
verfolgt Ihre Dateien für Sie. Der Befehlgit status
zeigt Ihnen alle Dateien an, die seit dem letzten Festschreiben geändert wurden.quelle
Dies ähnelt rsync: show, wenn eine neuere Datei auf dem Ziel überschrieben werden soll (wird später gefragt, obwohl es sich nicht um ein Duplikat handelt).
Wie in der Frage angegeben, erfordert "diff -q -r" möglicherweise eine gewisse Verarbeitung, um nützlich zu sein. In der Frage wurde die Form der Ausgabe nicht angegeben. Die Antworten geben verschiedene Arten von Berichten.
rsync
ist ein nützliches Werkzeug für diesen Zweck, weil es viel schneller ist alsdiff
. Die von @nils vorgeschlagene Lösung ist jedoch weitaus ausführlicher (und listet mehr Dateien auf) als die tatsächlichen Unterschiede zwischen den alten / neuen Verzeichnisbäumen. Wenn Sie das zum Beispiel mit dem Skript vergleichen, das ich für diese Antwort geschrieben habe, und mit denselben Daten arbeiten,Um neue Dateien
diff
richtig zu berücksichtigen , benötigen Sie ebenfalls die Option (die ich in keiner der vorgeschlagenen Antworten sehe). Da es jedoch viel langsamer ist (um Größenordnungen) , scheint es der richtige Weg zu sein, die Leistung des letzteren zu verbessern.-N
rsync
Weitere Lektüre
quelle
Ich war schon immer ein Teil von sha1sum (oder sogar md5sum; in diesem Zusammenhang ist es ziemlich sicher).
Manchmal - zum Beispiel, wenn zu viele Dateien umbenannt oder verschoben wurden - kann es hilfreich sein, das erste Feld zu sortieren und dann den Vergleich durchzuführen. Meistens ist dies jedoch ausreichend.
Beachten Sie, dass dies im Vergleich zu einigen anderen Methoden den Vorteil hat, dass Sie keine Kopie der "Vorher" -Dateien aufbewahren müssen. nur die md5sum-ausgabedatei.
quelle