Wie kann ich Find verwenden, um mehrere Subversion -Repositories rekursiv zu sichern?
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
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.