Ich versuche, einen Post-Commit-Hook für SVN zu schreiben, der auf unserem Entwicklungsserver gehostet wird. Mein Ziel ist es, eine Kopie des festgeschriebenen Projekts automatisch in das Verzeichnis auszuchecken, in dem es auf dem Server gehostet wird. Ich muss jedoch nur das letzte Verzeichnis in der an das Skript übergebenen Verzeichniszeichenfolge lesen können, um in dasselbe Unterverzeichnis auschecken zu können, in dem unsere Projekte gehostet werden.
Wenn ich beispielsweise ein SVN-Commit für das Projekt "example" durchführe, erhält mein Skript als erstes Argument "/ usr / local / svn / repos / example". Ich muss nur "Beispiel" vom Ende der Zeichenfolge entfernen und es dann mit einer anderen Zeichenfolge verknüpfen, damit ich zu "/ server / root / example" auschecken und die Änderungen sofort live sehen kann.
SUBDIR="/path/to/whatever/$(basename $1)"
$1
oder$1
ist leerDer folgende Ansatz kann verwendet werden, um einen beliebigen Pfad eines Pfadnamens abzurufen:
Ausgabe:
quelle
echo "$(basename "$(dirname "$pathname")")"
Bash kann den letzten Teil eines Pfades abrufen, ohne den externen aufrufen zu müssen
basename
:quelle
d=/home/me/somefolder;subdir="/$d/${1##*/}"
Am Ende hatte ich so etwas wie//home/me/somefolder//
das $ d, das tatsächlich aus einer Schleife stammt. Diefor d in $(find $SOMEFOLDER -maxdepth 1 -type d);
Verwendungsubdir=$(basename $d)
funktioniert wie erwartet.while
anstattfor
über die Ausgabe vonfind
(find -print0 | xargs -0
ist besser) zu iterieren, oder Globbing verwenden:for d in $SOMEFOLDER/*/
(Der endgültige Schrägstrich funktioniert wie-type d
- Sie können**
in Bash 4 für die Rekursion verwenden, wenn Sieshopt -s globstar
, aber eine Meldung "Argumentliste zu lang" ist möglich). Beachten Sie, dass der${1}
Teil des Befehls das erste Argument eines Skripts oder einer Funktion darstellt. Möglicherweise müssen Sie eine${d##*/}
andere Variablen- oder Argumentspezifikation verwenden oder sicherstellen, dass ein Argument übergeben wird.$1
$1
enthältthe path from which last component is to be taken out
. Ich habe diesen Teil verpasst. Mein Anwendungsfall:target_path='/home/user/dir1/dir2/dir3/'; target_path="${target_path%/}"; last_component=${target_path##*/}; echo $last_component
- Works 😉${1##*/}
funktioniert: unix.stackexchange.com/a/171786/15070