Wie kann ich Find verwenden, um mehrere Subversion -Repositories rekursiv zu sichern?

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

  •  06-07-2019
  •  | 
  •  

Frage

Im Moment führt unser Backup -Skript jeden Abend ausdrücklich mit Svnadmin Hotcopy auf jedem unserer Repositories aus. Unsere Repos werden alle unter einem übergeordneten Verzeichnis (/usr/local/svn/repos) gespeichert. Unser Backup -Skript enthält eine Zeile für jedes der Repos unter diesem Verzeichnis in der Reihe: /usr/local/backup/myrepo1

Anstatt für jedes neue Repo, das wir online bringen, manuell eine neue Zeile hinzufügen zu müssen, hoffte ich, den Befehl Find zu verwenden, um Svnadmin Hotcopy für jedes Verzeichnis auszuführen, das es unter/usr/local/svn/repos findet.

Bisher habe ich:

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \;

, wo ich "Svnadmin Hotcopy" durch den Einfachheitlichkeits willen durch "Echo" ersetze. Die Ausgabe davon ist:

/usr/local/backup/usr/local/svn/repos/ure
/usr/local/backup/usr/local/svn/repos/cheetah
/usr/local/backup/usr/local/svn/repos/casemgt
/usr/local/backup/usr/local/svn/repos/royalliver
/usr/local/backup/usr/local/svn/repos/ure_andras
/usr/local/backup/usr/local/svn/repos/profserv
/usr/local/backup/usr/local/svn/repos/frontoffice
/usr/local/backup/usr/local/svn/repos/ure.orig
/usr/local/backup/usr/local/svn/repos/projectcommon
/usr/local/backup/usr/local/svn/repos/playground
/usr/local/backup/usr/local/svn/repos/casegen

Das Problem ist der vollständige Pfad in {}. Ich brauche nur das letzte Element des Verzeichnisnamens an -exec übergeben

Die Ausgabe, die ich sein möchte:

/usr/local/backup/ure
/usr/local/backup/cheetah
/usr/local/backup/casemgt
/usr/local/backup/royalliver
/usr/local/backup/ure_andras
/usr/local/backup/profserv
/usr/local/backup/frontoffice
/usr/local/backup/ure.orig
/usr/local/backup/projectcommon
/usr/local/backup/playground
/usr/local/backup/casegen

Ich stecke an diesem Punkt ziemlich fest. Kann mir hier jemand helfen? Vielen Dank im Voraus, Dave

War es hilfreich?

Lösung

Sie waren auf dem richtigen Weg. Versuche dies:

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -printf "%f\0" | xargs -0 -I{} echo svnadmin hotcopy /usr/local/svn/repos/\{\} /usr/local/backup/\{\}

Das %f ist wie basename und der Null plus die -0 Auf Xargs stellt sicher, dass Namen mit Räumen usw. erfolgreich durchlaufen werden.

Entfernen Sie einfach die echo und nehmen Sie alle Anpassungen vor, die Sie benötigen, und es sollte den Trick ausführen.

Andere Tipps

Setzen Sie am Ende einen Cut -Befehl ein

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"

Wie wäre es mit einem Hinzufügen von a sed Filter, das den mittleren Teil herausschneidet?

sed 's/usr.local.svn.repos.//g'

So hinzugefügt

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} ";" | sed 's/usr.local.svn.repos.//g'
ls -al /usr/local/svn/repos/ |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo /usr/local/svn/repos/zzyggy

Es ist ein bisschen lang, aber es macht den Trick. Sie müssen nicht alles tun, wenn es zu finden ist, wenn es viele andere Shell -Befehle gibt, obwohl ich es in Python tun und die Shell für interaktive Arbeiten lassen würde, wenn ich diese Art von Skript schreiben müsste.

ls -al Listet alle Dateien im benannten Verzeichnis mit Attributen auf

grep '^d' Wählt die Zeilen aus, die mit D beginnen, die Verzeichnisse sind

sed Streifen Sie alle Zeichen links vom tatsächlichen Verzeichnisnamen ab. Möglicherweise müssen Sie einige Punkte hinzufügen oder löschen

xargs Nimmt die Liste der Verzeichnisnamen an und stellt sie einzeln aus. Ich habe Zygygy als Name angegeben, um den ausgeführten Befehl zu ersetzen, aber Sie können auswählen, was Ihnen gefällt. Natürlich würden Sie Echo durch Ihren Svnadmin -Befehl ersetzen.

Wenn es in einem Shell -Skript war, sollten Sie das wirklich tun

SVNDIRNAME="/usr/local/svn/repos"
ls -al $SVNDIRNAME |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo $SVNDIRNAME/zzyggy

Aber ich habe mich entschlossen, falsch und richtig zu zeigen, nur um diesen Punkt zu erklären. Ich werde dies mit einem Shell -Tag markieren, aber ich denke immer noch, dass ein Python -Skript eine überlegene Art ist, diese Art von Problem im 21. Jahrhundert zu lösen.

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