Hallo Flugies,
ich hab ein Verzeichnis (teils mit links) A. Das hab ich nach B kopiert. In B habe ich ein paar Änderungen gemacht. Teils sind files dazugekommen, welche gelöscht (auch binaries und links).
Wie kann ich diese Handarbeit automatisieren und die aus A wieder B machen? Und noch besser wäre, die Änderungen auf ein Verzeichnis C anwenden? Also auch in C sollen wieder Files gelöscht und andere hinzugefügt werden. Es geht also nicht um Änderungen in den Files, sondern nur um ihr löschen bzw hinzufügen.
Ich hab das erst mit diff/patch probiert, aber abgesehen von den Problemen (siehe unten), scheint mir das nicht der richtige Weg, weil das mehr auf Fileinhalte geht.
----
Hab das mal mit diff -Nupr A B > A_2_B.patch bei auch nur einseitig vorhanden binaries kam im Patch aber lediglich ein binary differs an.
also: diff -Nupra A B > A_2_B.patch
Ist zwar unnötig den Inhalt der binaries die verschwinden im Patch zu haben, aber ok.
Leider klappt das mit dem Wiederherstellen nicht so gut:
patch -f -p 0 < A_2_B.patch
(-f wegen der vielen Frage)
Es gibt Probleme wie dieses: File A/usr/lib/libhistory.so.6 is not a regular file -- refusing to patch 1 out of 1 hunk ignored -- saving rejects to file A/usr/lib/libhistory.so.6.rej
Gruß Arno
Am Donnerstag, 09. März 2017 13:10 CET, "Arno Steffens" epsi@gmx.de schrieb:
Hallo Flugies,
ich hab ein Verzeichnis (teils mit links) A. Das hab ich nach B kopiert. In B habe ich ein paar Änderungen gemacht. Teils sind files dazugekommen, welche gelöscht (auch binaries und links).
Wie kann ich diese Handarbeit automatisieren und die aus A wieder B machen? Und noch besser wäre, die Änderungen auf ein Verzeichnis C anwenden? Also auch in C sollen wieder Files gelöscht und andere hinzugefügt werden.#
Ist das nicht ein Job für rsync? Genau dafür wurde es doch geschrieben. Das ist erst dann nicht genug wenn Du sowohl A als auch B verändert hast. Dann brauchst Du soetwas wie Unison. Oder habe ich da das Problem nicht ganz verstanden? Gruss RalfD
Gesendet: Donnerstag, 09. März 2017 um 13:22 Uhr Von: "Ralf Mattes" rm@mh-freiburg.de An: "Arno Steffens" epsi@gmx.de Cc: flug@lug-freiburg.de Betreff: Re: [Flug] ?==?utf-8?q? diff / patch mit binaries ?
Am Donnerstag, 09. März 2017 13:10 CET, "Arno Steffens" epsi@gmx.de schrieb:
Hallo Flugies,
ich hab ein Verzeichnis (teils mit links) A. Das hab ich nach B kopiert. In B habe ich ein paar Änderungen gemacht. Teils sind files dazugekommen, welche gelöscht (auch binaries und links).
Wie kann ich diese Handarbeit automatisieren und die aus A wieder B machen? Und noch besser wäre, die Änderungen auf ein Verzeichnis C anwenden? Also auch in C sollen wieder Files gelöscht und andere hinzugefügt werden.#
Ist das nicht ein Job für rsync? Genau dafür wurde es doch geschrieben. Das ist erst dann nicht genug wenn Du sowohl A als auch B verändert hast. Dann brauchst Du soetwas wie Unison. Oder habe ich da das Problem nicht ganz verstanden? Gruss RalfD
Ursprünglich war ich davon ausgeganen, so eine Art Handlungsanweisung: Lösche File x, füge z hinzu zu haben (ähnlich wie diff/patch).
Für sync muss man B als Referenz immer behalten. Das wäre natürlich auch denkbar. Aber kann den Sync auch ein File in A behalten, wenn es in B zwar auch vorhanden, aber nicht gleich ist?
Ich hab mit rsync noch gar keine Erfahrung, aber gute Tip!
Danke
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Thu, Mar 09, 2017 at 01:22:07PM +0100, Ralf Mattes wrote:
Am Donnerstag, 09. März 2017 13:10 CET, "Arno Steffens" epsi@gmx.de schrieb:
Hallo Flugies,
ich hab ein Verzeichnis (teils mit links) A. Das hab ich nach B kopiert. In B habe ich ein paar Änderungen gemacht. Teils sind files dazugekommen, welche gelöscht (auch binaries und links).
Wie kann ich diese Handarbeit automatisieren und die aus A wieder B machen? Und noch besser wäre, die Änderungen auf ein Verzeichnis C anwenden? Also auch in C sollen wieder Files gelöscht und andere hinzugefügt werden.#
Ist das nicht ein Job für rsync? Genau dafür wurde es doch geschrieben. Das ist erst dann nicht genug wenn Du sowohl A als auch B verändert hast. Dann brauchst Du soetwas wie Unison. Oder habe ich da das Problem nicht ganz verstanden?
Da gebe ich Ralf absolut recht. Ich weiss nicht, was Du da gerade versuchst (vielleicht vereinfacht sich das Problem, wenn Du Deinen Kopf leicht schräg hältst :), aber für das, was Du beschreibst, willst Du Dir die Option --write-batch (bzw. --only-write-batch) von rsync angucken. Oder aber -i (--itemize-changes) und selber dessen Output auswerten (vorsicht: rsync überträgt kleinere Dateien blind, wenn es denkt, dass sich die ganze Vergleichsmechanik nicht lohnt; es ist schliesslich für Netzwerke optimiert, wo ein round-trip evtl. viel teurer ist, als kurzerhand ein paar hundert byte durch die Röhre zu drücken).
lg - -- tomás
Gesendet: Donnerstag, 09. März 2017 um 14:33 Uhr Von: tomas@tuxteam.de An: flug@lug-freiburg.de Betreff: Re: [Flug] ?==?utf-8?q? diff / patch mit binaries ?
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Thu, Mar 09, 2017 at 01:22:07PM +0100, Ralf Mattes wrote:
Am Donnerstag, 09. März 2017 13:10 CET, "Arno Steffens" epsi@gmx.de schrieb:
Hallo Flugies,
ich hab ein Verzeichnis (teils mit links) A. Das hab ich nach B kopiert. In B habe ich ein paar Änderungen gemacht. Teils sind files dazugekommen, welche gelöscht (auch binaries und links).
Wie kann ich diese Handarbeit automatisieren und die aus A wieder B machen? Und noch besser wäre, die Änderungen auf ein Verzeichnis C anwenden? Also auch in C sollen wieder Files gelöscht und andere hinzugefügt werden.#
Ist das nicht ein Job für rsync? Genau dafür wurde es doch geschrieben. Das ist erst dann nicht genug wenn Du sowohl A als auch B verändert hast. Dann brauchst Du soetwas wie Unison. Oder habe ich da das Problem nicht ganz verstanden?
Da gebe ich Ralf absolut recht. Ich weiss nicht, was Du da gerade versuchst (vielleicht vereinfacht sich das Problem, wenn Du Deinen Kopf leicht schräg hältst :), aber für das, was Du beschreibst, willst Du Dir die Option --write-batch (bzw. --only-write-batch) von rsync angucken. Oder aber -i (--itemize-changes) und selber dessen Output auswerten (vorsicht: rsync überträgt kleinere Dateien blind, wenn es denkt, dass sich die ganze Vergleichsmechanik nicht lohnt; es ist schliesslich für Netzwerke optimiert, wo ein round-trip evtl. viel teurer ist, als kurzerhand ein paar hundert byte durch die Röhre zu drücken).
Danke Thomas und Ralf,
Yep, das rsync ... hat ne Menge Parameter. Gut dass ihr mich schon auf ein paar aufmerksam gemacht habt. Was ich nicht gefunden hab ist, das die Files nicht geprüft werden auf Inhalt/Datum ... sondern nur auf Vorhandensein. Also, wenn bereits vorhanden, dann nicht kopieren. Wenn in Quelle nicht vorhanden, dann löschen.
Was will ich eigentlich erreichen? Ich hab ein rootfs, das wird automatisch erzeugt. Das wird in ein paar Monaten auch etwas anders aussehen (update).
Dann habe ich derzeit diese rootfs abgespeckt (nicht benötigte libs und binaries raus). Ein paar wenige files, wie keys sind dazugekommen. Das wäre ein zweiter Schritt, den man auch getrennt ausführen kann, zur besseren Übersicht. Irgendwann soll das neue Filesystem auch abgespeckt werden, dann will ich nicht lange fackeln.
Manuell würde ich jetzt ein/zwei shell script schreiben, damit ich das eben in ein paar Monaten wieder machen kann. GGf müßte ich Versionsnr. der zu löschenden libs manuell anpassen. Aber ich wäre damit relativ schnell fertig und müsste nicht dauernd nachsehen/überlegen, welche Files gebraucht werden.
Ich fürchte, das kann rsync nicht leisten, oder?
Eine ganz passable Übersicht für das manuelle Batch liefert:
diff -rq A B | grep Only
Doof nur, dass jeder link zu Ausgaben führt wie
diff: A/var/tmp: No such file or directory diff: B/var/tmp: No such file or directory
Das kann man aber mit dem pipe in eine Datei abtrennen. Vielleicht ist das nicht die eleganteste, aber eine ziemlich transparente Lösung.
Ein schöne Wochenende und nochmal Danke für die Anregungen. Kopfschiefhalten ist keine schlechte Methode ;) Arno
Hallo Arno,
On 03/10/2017 12:32 PM, Arno Steffens wrote:
Manuell würde ich jetzt ein/zwei shell script schreiben, damit ich das eben in ein paar Monaten wieder machen kann. GGf müßte ich Versionsnr. der zu löschenden libs manuell anpassen. Aber ich wäre damit relativ schnell fertig und müsste nicht dauernd nachsehen/überlegen, welche Files gebraucht werden.
alternativ kann man auch das build-tool fixen, nichts unnötiges ins rootfs reinzulegen. Dann ist die Notwendigkeit das nachträglich zu reparieren weg.
Liebe Grüße Uwe