Załóżmy, że mam plik /from/here/to/there.txt
i to
zamiast /from/here/to
tego chcę uzyskać tylko ostatnią część jego nazwy katalogu , co mam zrobić?
81
Możesz użyć, basename
nawet jeśli nie jest to plik. Usuń nazwę pliku za pomocą dirname
, a następnie użyj, basename
aby pobrać ostatni element ciągu:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
kiedy go ustawiam.Przeciwieństwem
dirname
jestbasename
:basename "$(dirname "/from/here/to/there.txt")"
źródło
Korzystanie z
bash
funkcji tekstowych:$ s="/from/here/to/there.txt" $ s="${s%/*}" && echo "${s##*/}" to
źródło
Używając rozszerzenia parametrów Bash , możesz to zrobić:
path="/from/here/to/there.txt" dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname) last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename)
Jest to bardziej wydajne, ponieważ nie są używane żadne polecenia zewnętrzne.
źródło
Czysty sposób BASH:
s="/from/here/to/there.txt" [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}" to
źródło
.
. Nie zadziała, jeśli katalog ma kropkę.
. Zachowaj prostotę i użyj ukośnika/
jako separatora.Można
awk
to zrobić:awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
Wyjaśnienie:
-F'/'
ustawia separator pól na „/”$(NF-1)
<<<
używa wszystkiego po nim jako standardowego wejścia ( wyjaśnienie wiki )źródło
Jeszcze jeden sposób
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
źródło
printf "%s\n" "${x[-2]}"
.To pytanie jest podobne do TEGO .
Aby rozwiązać, co możesz zrobić:
DirPath="/from/here/to/there.txt" DirPath="$(dirname $DirPath)" DirPath="$(basename $DirPath)" echo "$DirPath"
Jak powiedział mój przyjaciel, jest to również możliwe:
basename `dirname "/from/here/to/there.txt"`
Aby uzyskać jakąkolwiek część swojej ścieżki, możesz:
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }' OR echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }' OR etc
źródło
Najwyższa odpowiedź jest absolutnie poprawna dla zadanego pytania. W bardziej ogólnym przypadku, w którym potrzebny katalog znajduje się w środku długiej ścieżki, takie podejście prowadzi do trudnego do odczytania kodu. Na przykład :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(basename $dir)"
W tym przypadku można użyć:
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6 THIS
źródło