file
がdir以外のファイルのパス名を格納するとします。
親ディレクトリを取得するにはどうすればよいですか?
値に/..
を追加して次のように機能しない理由
$ cd $file/..
cd: ./Tools/build.bat/..: No such file or directory
ありがとう。
想定
$ file=./Tools/build.bat
a POSIX互換シェル (zshを含む):
$ echo "${file%/*}"
./Tools
dirname
の場合:
$ echo "$(dirname -- "$file")"
./Tools
(少なくともGNU dirname
はオプションを取るため、--
は、パスがダッシュで始まる場合に必要です。)
zsh
を使用している場合は、:h
修飾子
cd $file:h
nを追加して、ディレクトリ構造でnレベルを上げることができます。
これはコマンドdirnameを使用すると非常に簡単です。次のようにします。
cd "$(dirname -- "$file")"
今、あなたはこれをさらに進めることができます
file=/home/switch87/.bashrc
cd "$(dirname -- "$file")"
cd "$(dirname -- "$file")"/..
最初のcdで/ home/switch87に、seccondで/ homeに移動します
非常に一般的な方法でファイルのディレクトリを取得します(ファイルが相対パス名または絶対パス名で知られているか、まったくパスがない場合)。
the_dir="$(cd -P "$(dirname "${filename}")";pwd)"
したがって、そのディレクトリの親を取得するには:
the_parent_dir="$(cd -P "$(dirname "${filename}")/..";pwd)"
cd -P:シンボリックリンクを使用するパスではなく、「実際の」(物理的な)パスを出力します。 -P
アウトも機能しますが、異なる結果が得られる場合があります(例:cd / ; ln -s /long/path/here shortcut ; cd shortcut ; pwd
はパスを表示します:/shortcut
、追加した場合-P
からcd
へ/long/path/here
代わりに)
私はreadlink
とdirname
の組み合わせを使用することを好みます。
parent=$(readlink -f "$(dirname "$file")")
cd $parent
dirname
はパスからファイル名を切り取り、readlink -f
ターン$path/..
を正規パスに挿入します。