Подтвердить что ты не робот

Как получить последнюю часть имени dirname в Bash

Предположим, что у меня есть файл /from/here/to/there.txt и хочу получить только последнюю часть своего dirname to вместо /from/here/to, что мне делать?

4b9b3361

Ответ 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