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


81

私はファイルを持っていると仮定/from/here/to/there.txtし、そのdirnameのの最後の部分だけを取得したいtoの代わりに/from/here/to、私は何をすべきでしょうか?

回答:


120

basenameファイルでなくても使えます。を使用してファイル名を削除しdirname、を使用basenameして文字列の最後の要素を取得します。

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

2
コマンド '$ dir = "$(dirname $ dir)"'は機能しませんが、 'dir = "$(dirname $ dir)"'は正常に機能します。
ニコライサイコ

2
私がdirそれを設定しているとき、私は前にドルを持っているべきではありませんでした。
David W.



9

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)

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


私はこれをテストしました。FreeBSDでの私の結果は次のとおりです。コード:#!/ bin / sh cd / var / svn / repos path = "$ 1" echo "$ {path}" dir = "$ {path%/ *}" echo "$ {dir } "actual =" $ {dir ## * /} "echo" $ {actual} "----------------------------- -----------結果:$ ./makerepo.sh / var / test / var / test / var var $ ------------------- - - - - - - - - - 不合格!ごめんなさい。良い方法のように見えましたが、正解ではありませんでした。
リチャードロバートソン

4

純粋なBASHの方法:

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

2
ファイルにドットがない場合は機能しません.。ディレクトリにドットがある場合は機能しません.。シンプルに保ち/、区切り文字としてスラッシュを使用します。
alvits 2014

1
本当にありがとうございました@Akshay
anubhava

3

それawkを行う方法は次のようになります。

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

説明:

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


1

この質問はのようなものです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

一番上の答えは、尋ねられた質問に対して絶対的に正しいです。長いパスの途中に必要なディレクトリがある、より一般的なケースでは、このアプローチはコードを読みにくくします。例えば ​​:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.