回答:
dirname のベース名が必要なようです。
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
コマンドは現在のディレクトリ(別名「。」)にあると想定します。
parentname="$(basename "$(dirname "$pwd")")"
PWD
れるため、大文字にする必要があります。試してくださいparentname="$(basename "$(dirname "$PWD")")"
。
これはリソースの少ないソリューションだと思います。
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
編集:申し訳ありませんが、ネストされた展開はbashでは不可能ですが、zshでは機能します。Bashバージョン:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
またはfilepath = / file` で試してください。
foofile
何ですか?それがフルパスでない場合、それを知ることはできません(foofile
「string」だけでなく、既存のファイルであるかどうか)。
bashでは、1行で:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
私はJulian67の答えが一番好きですが、ここに少し拡張されたバージョンがあります:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"