パスからディレクトリを抽出


123

私のスクリプトでは、作業しているファイルのディレクトリが必要です。たとえば、file = "stuff / backup / file.zip"です。変数から文字列「stuff / backup /」を取得する方法が必要です$file

回答:


203
dirname $file

あなたが探しているものです


+1、私を倒して。より速くなったでしょうが、それ以上に入力することが義務付けられていましたdirname $file
マッチ

1
dirname "$file"むしろ。引用符がないと、ファイル名またはディレクトリ名にスペースが含まれていると、これは正しく動作しません。
Charles Duffy

fml、質問はファイルから絶対ディレクトリを抽出する必要があります、どうすればいいですか?dirnameは私が推測する相対パスを生成します
Alexander Mills

これがwinバッチスクリプトで達成するのがいかに難しいかは際立っています。
バンカーダイブ

47
dirname $file

出力されます

stuff/backup

これは反対ですbasename

basename $file

出力します

file.zip

私はマットがそこからそれを理解できると思った(man dirname):)
Matthieu

1
私たちはすべてマットのここにいると思います。ただの推測です。しかし、私はあなたの答えと私の答えを区別しようとしただけです。=)
マッチ

ええ、私もベースネームをたくさん使っています、それはとても気の利いた=)しかし、私はファイルのディレクトリをグーグルで返すことについて何も見つけることができませんでした!私は正しい言葉を探していなかったと思います。ああ、私たち3人全員がマットですか?:D
Matt

1
これらのコマンドがスペース(グロブ文字など)を含む名前で機能するように、必要な引用符を追加することを検討してください。
Charles Duffy

3

${file%/*}外部コマンドに依存しないので、Urvin / LuFFyによって提案されたようなものを使用することは技術的に優れています。同じ方法でベース名を取得するには、次のようにします${file##*/}。必要がない限り、外部コマンドを使用する必要はありません。

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

この方法でも、POSIXに完全に準拠します。それが役に立てば幸い!:-)


1
(より効率的な)組み込みのアプローチよりも優れているケースが1つありdirnameます。それは、パスが最初から完全に修飾されているかどうかわからない場合です。あなたが持っている場合はfile=file.zipdirname "$file"返され.、一方、${file%/*}戻りますfile.zip
Charles Duffy

1
...もちろん、ブランチすることもできます:case $file in */*) dir=${file%/*};; *) dir=.;; esacはまだPOSIX-yであり、問​​題に対処しています。
Charles Duffy


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