Bashのファイルパス引数の最後のディレクトリ名/ファイル名を取得する


228

開発サーバーでホストされているSVNのコミット後フックを記述しようとしています。私の目標は、コミットされたプロジェクトのコピーを、サーバーでホストされているディレクトリに自動的にチェックアウトすることです。ただし、プロジェクトがホストされているのと同じサブディレクトリにチェックアウトするには、スクリプトに渡されたディレクトリ文字列の最後のディレクトリのみを読み取ることができる必要があります。

たとえば、SVNをプロジェクト「example」にコミットすると、スクリプトは最初の引数として「/ usr / local / svn / repos / example」を取得します。「/ server / root / example」にチェックアウトして変更がすぐに反映されるように、文字列の末尾から「例」だけを取り出して別の文字列と連結する必要があります。

回答:


344

basename パスのディレクトリプレフィックスを削除します。

$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example

2
basenameは間違いなく私が探しているものです。変数に格納されている引数のベース名を取得するにはどうすればよいですか?例えばSUBDIR="/path/to/whatever/$(basename $1)"
TJ L

5
@ tj111:ノーであるような音$1、または$1空である
かなった

残念ながら、コマンドをラップする場合、basenameはお勧めできません。心に留めておくべきこと
dtc '20 / 07/20

98

次の方法を使用して、パス名の任意のパスを取得できます。

some_path=a/b/c
echo $(basename $some_path)
echo $(basename $(dirname $some_path))
echo $(basename $(dirname $(dirname $some_path)))

出力:

c
b
a

1
スペースのあるパスでは機能しません...引用符でそれを克服できます...どういうわけか機能しますecho "$(basename "$(dirname "$pathname")")"
Ray Foss

75

Bashはパスの最後の部分を取得できます。externalを呼び出す必要はありませんbasename

subdir="/path/to/whatever/${1##*/}"

2
私のMacでは、サブストリング表記の使用は、数千のファイルのそれぞれに対して些細なことをしている場合、dirname / basenameよりも桁違いに高速です。
ジョージ

1
d=/home/me/somefolder;subdir="/$d/${1##*/}"私のようなものになってしまった//home/me/somefolder//dが実際にループから来る$ for d in $(find $SOMEFOLDER -maxdepth 1 -type d);使用してsubdir=$(basename $d)期待どおりに動作します。
Buttle Butkus、

1
@ButtleButkus:あなたは使用する必要があるwhileの代わりに、for出力を反復するfindfind -print0 | xargs -0優れている)、または使用することは、グロビング:for d in $SOMEFOLDER/*/(最後のスラッシュは次のように動作します-type d-あなたが使用することができ**ます場合は、再帰のためバッシュ4でshopt -s globstar「あまりにも長い引数リスト」メッセージであるが、可能)。${1}コマンドの部分は、スクリプトまたは関数の最初の引数を表すことに注意してください。あなたは使用する必要があるかもしれません${d##*/}またはいくつかの他の変数や引数の指定や、引数が渡されていることを確認してください$1
追って通知があるまで一時停止。

2
@DennisWilliamson 感謝のためにたくさんの共有なぜそれが機能しないのか、私がここで唯一愚かであるのか疑問に思う将来の読者のために 😂。上記の回答は、$1が含まれていることを前提としていますthe path from which last component is to be taken out。その部分を逃した。私のユースケース:target_path='/home/user/dir1/dir2/dir3/'; target_path="${target_path%/}"; last_component=${target_path##*/}; echo $last_component-作品😉
ビナイVissh

2
仕組み理由の 説明については、こちらをご覧ください${1##*/}unix.stackexchange.com/a/171786/15070
Matthew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.