web-dev-qa-db-ja.com

Bashでdirnameの最後の部分を取得する方法

ファイル/from/here/to/there.txtがあり、そのディレクトリ名の最後の部分/from/here/toではなくtoだけを取得したい場合、どうすればよいですか?

63
eggplantelf

ファイルではありませんが、basenameを使用できます。 dirnameを使用してファイル名を取り除き、basenameを使用して文字列の最後の要素を取得します。

dir="/from/here/to/there.txt"
dir="$(dirname $dir)"   # Returns "/from/here/to"
dir="$(basename $dir)"  # Returns just "to"
91
David W.

bash文字列関数の使用:

$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
19
jaypal singh

dirnameの反対はbasenameです:

basename "$(dirname "/from/here/to/there.txt")"
18
that other guy

純粋なBASHの方法:

s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
4
anubhava

Bash parameter expansion を使用すると、次のことができます。

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)

外部コマンドが使用されないため、これはより効率的です。

3
codeforester

もう一つの方法

IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
2
iruvar

awkの方法は次のとおりです。

awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"

説明:

  • -F'/'はフィールド区切り文字を「/」に設定します
  • 最後から2番目のフィールド$(NF-1)を出力します
  • <<<はその後のすべてを標準入力として使用します( wikiの説明
1
csiu

この質問は THIS のようなものです。

あなたができることを解決するために:

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
1
MLSC