フルパスから拡張子なしでファイル名を抽出する方法は?


10

最初のbashスクリプトを修正しようとしています。ある時点で、ファイル名がとしてスクリプトに渡され$1ます。拡張子なしでファイル名を抽出する必要があります。
現在、すべての拡張子が3文字であると想定しているため、最後の4文字を削除してファイル名を取得します。

a="${1:0:-4}"

しかし%~n1、Windowsのように、3文字を超える拡張機能を使用できるようにする必要があります。
引数から拡張子なしでファイル名を抽出する方法はありますか?


回答:


27

これをbashで行う通常の方法は、パラメーター展開を使用することです。(bashの manページを参照して、「Parameter Expansion」を検索してください。)

a=${1%.*}

%(以下のパターンマッチングそのすべてを示し.*最短マッチを使用して、右から)を、パラメータから削除されるべきです$1。この場合、式を二重引用符( ")で囲む必要はありません。


1
ファイルのパターンは、通常、「Something.eng.ext」のようになります。この場合明らかにextが拡張ですが、$ {1%。*}を使用すると「Something」の部分のみが返されますよね?
user304822 2014年

2
番号${1%.*}を返しますSomething.eng。あなたは、最初の右にあるすべて取り除きたい場合.を含め.、使用${1%%.*}返します、Something
garyjohn 2014年


0

basenameを使用しないBashのワンライナー:

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.