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