web-dev-qa-db-ja.com

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

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

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

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

10
user304822

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

a=${1%.*}

%は、可能な限り最短一致を使用して、右から(.*)に続くパターンに一致するすべてのものをパラメーター$1から削除することを示します。この場合、式を二重引用符( ")で囲む必要はありません。

27
garyjohn

拡張子がわかっている場合は、 basename を使用できます

$ basename /home/jsmith/base.wiki .wiki
base
13
Steven Penny

ベース名を使用しないBashのワンライナー:

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
0
LuckyDams