ファイルの親ディレクトリを取得する


24

ファイルの親ディレクトリの名前だけを取得したい。

例:私が持っているときpath=/a/b/c/d/file、私はしたいdといない/a/b/c/d(私はから取得されdirname $path出力されます)。

これを行うための洗練された方法はありますか?

回答:


26

dirname のベース名必要なようです。

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

なぜ私は受け取っています。Debianの親ディレクトリの代わりに?
アミール

@アミール:絶対パスで始めていますか、それともファイル名だけですか?ファイル名のみの場合、dirnameコマンドは現在のディレクトリ(別名「。」)にあると想定します。
ゴードンデイヴィ

まあ、私はこれを使用しています:parentname="$(basename "$(dirname "$pwd")")"
アミール

1
@Amir:シェル変数では大文字と小文字が区別さPWDれるため、大文字にする必要があります。試してくださいparentname="$(basename "$(dirname "$PWD")")"
ゴードンデイヴィソン


2

これはリソースの少ないソリューションだと思います。

 $ 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」だけでなく、既存のファイルであるかどうか)。
ウズソルト

1

bashでは、1行で:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
関連する手順を詳しく説明してください。それは将来の読者の助けになるでしょう。また、1/2行の回答を書かないようにしてください。
ロレンツォフォンマッターホルン

0

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