Припустимо, у мене є файл /from/here/to/there.txt
, і я хочу отримати лише останню частину його імені to
замість того /from/here/to
, що мені робити?
Відповіді:
Ви можете використовувати, basename
навіть якщо це не файл. Видаліть ім'я файлу за допомогою dirname
, а потім використовуйте, basename
щоб отримати останній елемент рядка:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
як я встановлюю це.
Протилежність dirname
IS basename
:
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)
<<<
використовує що-небудь після цього як стандартне введення ( пояснення wiki )Ще один спосіб
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