Предположим, у меня есть файл /from/here/to/there.txt
, и я хочу получить только последнюю часть его имени каталога to
вместо того /from/here/to
, что мне делать?
81
Вы можете использовать, basename
даже если это не файл. Удалите имя файла с помощью dirname
, затем используйте basename
для получения последнего элемента строки:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
когда устанавливаю его.Противоположность
dirname
ISbasename
:basename "$(dirname "/from/here/to/there.txt")"
источник
Использование
bash
строковых функций:$ s="/from/here/to/there.txt" $ s="${s%/*}" && echo "${s##*/}" to
источник
Используя расширение параметра Bash , вы можете сделать это:
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)
Это более эффективно, поскольку не используются внешние команды.
источник
Чистый способ BASH:
s="/from/here/to/there.txt" [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}" to
источник
.
. Не будет работать, если в каталоге есть точка.
. Сделайте это простым и используйте косую черту в/
качестве разделителя.Один из
awk
способов сделать это:awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
Пояснение:
-F'/'
устанавливает разделитель полей как "/"$(NF-1)
<<<
использует что-либо после него как стандартный ввод ( объяснение вики )источник
Еще один способ
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
источник
printf "%s\n" "${x[-2]}"
.Этот вопрос что - то вроде этого .
Для решения этого вы можете:
DirPath="/from/here/to/there.txt" DirPath="$(dirname $DirPath)" DirPath="$(basename $DirPath)" echo "$DirPath"
Как сказал мой друг, это тоже возможно:
basename `dirname "/from/here/to/there.txt"`
Чтобы пройти любую часть своего пути, вы можете:
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }' OR echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }' OR etc
источник
Главный ответ абсолютно правильный для заданного вопроса. В более общем случае, когда необходимый каталог находится в середине длинного пути, этот подход приводит к затруднению чтения кода. Например :
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)"
В этом случае можно использовать:
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6 THIS
источник