Holen Sie sich last-Ordnername/Dateiname in einem Pfad-argument in der Bash
Ich versuche zu schreiben, ein post-commit-hook für den SVN, die gehostet wird auf unserem Entwicklungs-server. Mein Ziel ist es, zu versuchen, automatisch zu der Kaufabwicklung eine Kopie von dem engagierten Projekt in das Verzeichnis, wo es auf dem server gehostet wird. Aber ich muss in der Lage sein zu Lesen, nur das Letzte Verzeichnis in der Verzeichnis-string an das Skript übergeben, um zur Kasse zu einem sub-Verzeichnis, in dem unsere Projekte gehostet werden.
Zum Beispiel, wenn ich ein SVN commit an das Projekt "Beispiel", mein script bekommt "/usr/local/svn/repos/Beispiel" als erstes argument. Ich brauche, um einfach nur "Beispiel" aus dem Ende der Schnur und dann concat es mit einer anderen Zeichenfolge, so kann ich die checkout "/server/root/Beispiel" und sehen Sie die änderungen sofort live.
Du musst angemeldet sein, um einen Kommentar abzugeben.
basename
tut, entfernen Sie das Verzeichnis Präfix Pfad:SUBDIR="/path/to/whatever/$(basename $1)"
$1
oder$1
leer istFolgende Ansatz verwendet werden kann, die eine Pfad von pathname:
Ausgabe:
echo "$(basename "$(dirname "$pathname")")"
Bash können, um den letzten Teil eines Pfades ist die zimmerreserviereung, ohne das aufrufen der externen
basename
:d=/home/me/somefolder;subdir="/$d/${1##*/}"
Ich endete mit etwas, das wie//home/me/somefolder//
die $d kommt tatsächlich aus einer Schleifefor d in $(find $SOMEFOLDER -maxdepth 1 -type d);
Mitsubdir=$(basename $d)
funktioniert wie erwartet.while
stattfor
zur Iteration über die Ausgabe vonfind
(find -print0 | xargs -0
ist besser) oder Platzhalter verwenden:for d in $SOMEFOLDER/*/
(der Letzte slash funktioniert wie-type d
- Sie können**
in Bash 4 für die Rekursion, wenn Sieshopt -s globstar
, aber ein "Argument list too long" Meldung ist möglich). Beachten Sie, dass die${1}
Teil des Befehls stellt das erste argument ein Skript oder eine Funktion. Möglicherweise müssen Sie verwenden${d##*/}
oder einige andere variable oder argument Spezifikation oder stellen Sie sicher, dass ein argument übergeben wird, in$1
/
?/
ersten (dies hat keine Wirkung, wenn es keine nachfolgenden/
). Es muss in zwei Schritten erfolgen:subdir="${1%/}"; subdir="/path/to/whatever/${1##*/}"
$1
enthältthe path from which last component is to be taken out
. Ich vermisste, dass ein Teil. Mein use-case:target_path='/home/user/dir1/dir2/dir3/'; target_path="${target_path%/}"; last_component=${target_path##*/}; echo $last_component
- Werke ?${1##*/}
funktioniert: unix.stackexchange.com/a/171786/15070