web-dev-qa-db-ja.com

指定されたファイルの親ディレクトリを取得します

fileがdir以外のファイルのパス名を格納するとします。

親ディレクトリを取得するにはどうすればよいですか?

値に/..を追加して次のように機能しない理由

$ cd $file/..   
cd: ./Tools/build.bat/..: No such file or directory

ありがとう。

11
Tim

想定

$ file=./Tools/build.bat

a POSIX互換シェル (zshを含む):

$ echo "${file%/*}"
./Tools

dirname の場合:

$ echo "$(dirname -- "$file")"
./Tools

(少なくともGNU dirnameはオプションを取るため、--は、パスがダッシュで始まる場合に必要です。)

20
ilkkachu

zshを使用している場合は、:h修飾子

cd $file:h

nを追加して、ディレクトリ構造でnレベルを上げることができます。

7
jimmij

これはコマンドdirnameを使用すると非常に簡単です。次のようにします。

cd "$(dirname -- "$file")"

今、あなたはこれをさらに進めることができます

file=/home/switch87/.bashrc
cd "$(dirname -- "$file")"
cd "$(dirname -- "$file")"/..

最初のcdで/ home/switch87に、seccondで/ homeに移動します

6
switch87

非常に一般的な方法でファイルのディレクトリを取得します(ファイルが相対パス名または絶対パス名で知られているか、まったくパスがない場合)。

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代わりに)

3
Olivier Dulac

私はreadlinkdirnameの組み合わせを使用することを好みます。

parent=$(readlink -f "$(dirname "$file")")
cd $parent

dirnameはパスからファイル名を切り取り、readlink -fターン$path/..を正規パスに挿入します。

1
rrauenza