Próbuję napisać haczyk po zatwierdzeniu SVN, który jest hostowany na naszym serwerze programistycznym. Moim celem jest próba automatycznego pobrania kopii zatwierdzonego projektu do katalogu, w którym znajduje się on na serwerze. Jednak muszę być w stanie odczytać tylko ostatni katalog z ciągu katalogu przekazanego do skryptu, aby przejść do tego samego podkatalogu, w którym hostowane są nasze projekty.
Na przykład, jeśli dokonam zatwierdzenia SVN dla projektu „przykład”, mój skrypt otrzyma „/ usr / local / svn / repos / example” jako pierwszy argument. Muszę pobrać tylko „przykład” z końca łańcucha, a następnie połączyć go z innym łańcuchem, aby móc przejść do kasy „/ server / root / example” i natychmiast zobaczyć zmiany na żywo.
SUBDIR="/path/to/whatever/$(basename $1)"
$1
, lub$1
jest pustyAby uzyskać dowolną ścieżkę do ścieżki, można zastosować następujące podejście:
Wynik:
źródło
echo "$(basename "$(dirname "$pathname")")"
Bash może uzyskać ostatnią część ścieżki bez konieczności wywoływania zewnętrznego
basename
:źródło
d=/home/me/somefolder;subdir="/$d/${1##*/}"
Skończyło się na tym,//home/me/somefolder//
że $ d faktycznie pochodzi z pętlifor d in $(find $SOMEFOLDER -maxdepth 1 -type d);
Używaniesubdir=$(basename $d)
działa zgodnie z oczekiwaniami.while
zamiastfor
iterować wynikfind
(find -print0 | xargs -0
jest lepszy) lub globbing:for d in $SOMEFOLDER/*/
(końcowe slash działa jak-type d
- możesz użyć**
w Bash 4 do rekurencji, jeślishopt -s globstar
, ale komunikat „Za długa lista argumentów” to możliwy). Zauważ, że${1}
część polecenia reprezentuje pierwszy argument skryptu lub funkcji. Może być konieczne użycie${d##*/}
innej specyfikacji zmiennej lub argumentu albo upewnienie się, że argument jest przekazywany$1
$1
zawierathe path from which last component is to be taken out
. Tęskniłem za tą częścią. Mój przypadek użycia:target_path='/home/user/dir1/dir2/dir3/'; target_path="${target_path%/}"; last_component=${target_path##*/}; echo $last_component
- Działa 😉${1##*/}
działa: unix.stackexchange.com/a/171786/15070