So vergleichen Sie Dateien mit demselben Namen in zwei verschiedenen Verzeichnissen mithilfe eines Shell-Skripts

StackOverflow https://stackoverflow.com/questions/119788

  •  02-07-2019
  •  | 
  •  

Frage

Bevor ich dazu überging, SVN zu verwenden, verwaltete ich mein Projekt, indem ich einfach eine behielt /develop/ Verzeichnis und bearbeiten und testen Sie Dateien dort und verschieben Sie sie dann in das /main/ Verzeichnis.Als ich mich entschied, zu SVN zu wechseln, musste ich sicherstellen, dass die Verzeichnisse tatsächlich synchron waren.

Was ist also eine gute Möglichkeit, ein Shell-Skript [bash] zu schreiben, um Dateien mit demselben Namen in zwei verschiedenen Verzeichnissen rekursiv zu vergleichen?

Notiz:Die oben verwendeten Verzeichnisnamen dienen nur als Beispiel.Ich empfehle nicht, Ihren Code in der obersten Ebene zu speichern :).

War es hilfreich?

Lösung

Der Diff-Befehl hat eine Option -r rekursiv Verzeichnisse vergleichen:

diff -r /develop /main

Andere Tipps

diff -rqu /develop /main

Es wird Ihnen nur eine Zusammenfassung der Änderungen auf diese Weise :)

Wenn Sie wollen, nur um zu sehen neu / fehlende Dateien

diff -rqu /develop /main | grep "^Only

Wenn Sie möchten, um sie kahl:

diff -rqu /develop /main | sed -rn "/^Only/s/^Only in (.+?): /\1/p"

Das diff ich zur Verfügung haben können rekursive Unterschiede:

diff -r main develop

Aber mit einem Shell-Skript:

( cd main ; find . -type f -exec diff {} ../develop/{} ';' )

[Ich habe irgendwo gelesen, dass Sie Ihre eigenen Fragen zu beantworten OK ist, so geht hier :)]

Ich habe versucht, und es funktionierte ziemlich gut

[/]$ cd /develop/
[/develop/]$ find | while read line; do diff -ruN "/main/$line" $line; done |less

Sie können wählen, nur bestimmte Dateien vergleichen [zum Beispiel nur die .php diejenigen] bearbeite die obige Zeile wie

[/]$ cd /develop/
[/develop/]$ find -name "*.php" | while read line; do diff -ruN "/main/$line" $line; done |less

Jede andere Ideen?

Hier ist ein Beispiel für ein (etwas chaotisches) Skript von mir: dircompare.sh, welches wird:

  • Sortieren Sie Dateien und Verzeichnisse in Arrays in zwei rekursiven Durchgängen, je nachdem, in welchem ​​Verzeichnis sie vorkommen (oder in beiden).
  • Die Dateien, die in beiden Verzeichnissen vorkommen, werden je nach if noch einmal in zwei Arrays sortiert diff -q bestimmt, ob sie sich unterscheiden oder nicht
  • für diese Dateien, die diff Ansprüche sind gleich, Zeitstempel anzeigen und vergleichen

Ich hoffe, es kann nützlich sein – Prost!

EDIT2:(Eigentlich funktioniert es gut mit Remote-Dateien – das Problem war das nicht behandelte Strg-C-Signal während eines Diff-Vorgangs zwischen lokaler und Remote-Datei, was eine Weile dauern kann;Das Skript wurde jetzt mit einer Falle aktualisiert, um dies zu handhaben. Die vorherige Bearbeitung bleibt jedoch unten als Referenz übrig):

BEARBEITEN:...außer es scheint meinen Server für ein Remote-SSH-Verzeichnis zum Absturz zu bringen (das ich versucht habe, es zu verwenden). ~/.gvfs)...Das ist also nicht der Fall bash mehr, aber eine Alternative ist meiner Meinung nach die Verwendung rsync, hier ist ein Beispiel:

$ # get example revision 4527 as testdir1
$ svn co https://openbabel.svn.sf.net/svnroot/openbabel/openbabel/trunk/data@4527 testdir1

$ # get earlier example revision 2729 as testdir2
$ svn co https://openbabel.svn.sf.net/svnroot/openbabel/openbabel/trunk/data@2729 testdir2

$ # use rsync to generate a list 
$ rsync -ivr --times --cvs-exclude --dry-run testdir1/ testdir2/
sending incremental file list
.d..t...... ./
>f.st...... CMakeLists.txt
>f.st...... MACCS.txt
>f..t...... SMARTS_InteLigand.txt
...
>f.st...... atomtyp.txt
>f+++++++++ babel_povray3.inc
>f.st...... bin2hex.pl
>f.st...... bondtyp.h
>f..t...... bondtyp.txt
...

Beachten Sie, dass:

  • Um das oben Genannte zu erreichen, dürfen Sie abschließende Schrägstriche nicht vergessen / am Ende der Verzeichnisnamen in rsync
  • --dry-run - Nur simulieren, keine Dateien aktualisieren/übertragen
  • -r - Rekursion in Verzeichnisse
  • -v - ausführlich (aber nicht im Zusammenhang mit Informationen zu Dateiänderungen)
  • --cvs-exclude - ignorieren .svn Dateien
  • -i - "--itemize-changes:eine Änderungszusammenfassung für alle Updates ausgeben“

Hier ein kurzer Auszug man rsync Das erklärt die von angezeigten Informationen -i (zum Beispiel die >f.st...... Zeichenfolgen oben):

The  "%i"  escape  has a cryptic output that is 11 letters long.
The general format is like the string YXcstpoguax,  where  Y  is
replaced  by the type of update being done, X is replaced by the
file-type, and the other letters represent attributes  that  may
be output if they are being modified.

The update types that replace the Y are as follows:

o      A  < means that a file is being transferred to the remote
       host (sent).

o      A > means that a file is being transferred to  the  local
       host (received).

o      A  c  means that a local change/creation is occurring for
       the item (such as the creation  of  a  directory  or  the
       changing of a symlink, etc.).

...
The file-types that replace the X are: f for a file, a d  for  a
directory,  an  L for a symlink, a D for a device, and a S for a
special file (e.g. named sockets and fifos).

The other letters in the string above  are  the  actual  letters
that  will be output if the associated attribute for the item is
being updated or a "." for no change.  Three exceptions to  this
are:  (1)  a newly created item replaces each letter with a "+",
(2) an identical item replaces the dots with spaces, and (3)  an
....

In der Tat etwas kryptisch, aber es zeigt zumindest den grundlegenden Verzeichnisvergleich ssh.Prost!

Die klassische (System V Unix) Antwort dircmp dir1 dir2 werden würde, die ein Shell-Skript war, die entweder in dir1 gefundenen Dateien auflisten würde, aber nicht Dir2 oder in dir2 aber nicht am Anfang (erste Seite der Ausgabe vom pr Befehl Dir1 , so mit Überschriften paginierte), durch einen Vergleich der einzelnen gemeinsamen Datei mit einer Analyse gefolgt (gleich, unterschiedlich, Verzeichnis die häufigsten Ergebnisse waren).

Dies scheint in dem Prozess des Verschwindens zu sein - ich habe eine unabhängige Neuimplementierung davon zur Verfügung, wenn Sie sie brauchen. Es ist kein Hexenwerk (cmp ist dein Freund).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top