Skip to content

Tip #10: Alle SVN-Wurzelverzeichnisse anzeigen

Ich habe in meinem $HOME-Verzeichnis relativ verstreut diverse SVN-Verzeichnisse liegen. Das ist Software, die ich als SVN-Version nutze oder Vorlesungsmitschriften und z.T. auch Einstellungen (also Verzeichnisse mit einem Punkt am Anfang). Mein Ziel war ein Skript, was alle diese Verzeichnisse findet und dann dort ein svn update macht. Der letzte Punkt ist eher trivial. Als schwierig erwies sich das Finden der entsprechenden Verzeichnisse.

Meine erste Idee war, das Programm find zu nutzen. Mit der Zeile find $HOME -type d -name .svn erhalte ich alle Verzeichnisse, die .svn im Namen tragen. Im speziellen aber auch alle SVN-Unterverzeichnisse, die das Skript dann nicht benötigt. find hat ja noch die Option -maxdepth. Aber in diesem Falle bringt die mich nicht weiter. Nach einigem Überlegen kam ich dann dazu, die Ergebnisse an eine wilde Mischung aus sed und grep zu verfüttern. Irgendwie war das Ganze aber immer noch unbefriedigend und ich hätte lieber eine Shelllösung gehabt. Glücklicherweise war Stammtisch der LUG und ich diskutierte dort das Problem.

Nach einigem Hin und Her kamen wir dann auf die folgende zsh-Lösung:

ls_svn_dir() {
  if [ -d “$1/.svn” ]; then
    echo “$1”
  else
    for i in $1/{,.[!.]}*(/N); do
      ls_svn_dir “$i”
    done
  fi
}

ls_svn_dir “$1”

Das ist eine rekursiv definierte Shellfunktion. Diese schaut, ob das aktuelle Verzeichnis ein Unterverzeichnis .svn enthält. Falls ja, wird dieses ausgegeben. Andernfalls springt die Funktion in die for-Schleife. Das Konstrukt $1/{,.[!.]}*(/N) expandiert alle Unterverzeichnisse des in $1 stehenden (Dafür sorgt der ‘/’.) und gibt keinen Fehler aus, falls es keine Unterverzeichnisse gibt (Dafür sorgt das ‘N’.). Auf die Ergebnisse wird dann die Funktion rekursiv wieder aufgerufen.

Alles in allem ist das die Lösung, die ich mir vorgestellt habe. :-) Falls jemandem der mitlesenden zsh-Nutzer eine Verbesserung einfällt, bin ich für Vorschläge gern zu haben.

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

Jens Kubieziel on :

Jörg hatte noch eine bessere Idee:
Man kann das $1/{,.[!.]}*(/N) in $1/*(/ND) ändern. Das ‘D’ sorgt dafür, dass auch Punktverzeichnisse expandiert werden.

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
BBCode format allowed
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

You can use [geshi lang=lang_name [,ln={y|n}]][/geshi] tags to embed source code snippets.
Form options
cronjob