このbashコードを理解するのに役立ちます。 "${i%.*}_MYSUFFIX.${i##*.}"

このbashコードを理解するのに役立ちます。 "${i%.*}_MYSUFFIX.${i##*.}"
for i in *.shp; do ; mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}" ; done

このループは、_MYSUFFIX私のディレクトリのファイル拡張子の前に挿入されます。素晴らしい機能ですが、詳細を理解するのが難しいです。

"${i%.*}_MYSUFFIX.${i##*.}"

キャラクター拡張/交換? ? ?これを学ぶために説明と文書をどこで見つけるべきかわかりません。

答え1

i含まれていると仮定し、testing.an.string.with.dots.shp不明な部分にスペースを追加して結果を確認してください。

$ echo "${i%.*}   _MYSUFFIX.    ${i##*.}"
testing.an.string.with.dots   _MYSUFFIX.    shp

したがって、これらの「パラメータ拡張」はbashのマニュアルにあります。

LESS=+/#word man bash

リンクは「一致する接頭辞パターンの削除」項目に移動し、次の項目は「一致する接尾辞パターンの削除」です。名前は各人の役割を意味します。 1つは変数(パラメータ)の内容の前の文字を削除し、もう1つは末尾(尾)の文字を削除します。

単一文字を使用する#か、%短い一致部分を削除してください。

文字を2倍にする##か、%%一致する最も長い部分を削除してください。

したがって、aは、点()で始まる最後から最後まで、最も短い文字列を削除して再生成します"${i%.*}"。これは単に「拡張子(および点)の削除」を意味します。$i.

Aは、後にドットが付いた項目に一致する最も長い文字列を前から削除しながら"${i##*.}"値を再現します。$i簡単に言えば、拡張子だけを維持してください。

その後、3つの部分がすべて1つの文字列に連結されます。

答え2

だからマニュアルでtl;dr:

i=bob.was.here.shp
nameFront="${i%.*}" # Deletes shortest match of ".*" from back of $i, one "." only
echo Front=$nameFront
nameExt=${i##*.}    # Deletes longest match of "*." from front of $i, so include "."'s
echo Ext=$nameExt
echo New="${nameFront}_MYSUFFIX.${nameExt}"


Giving:
Front=bob.was.here
Ext=shp
New=bob.was.here_MYSUFFIX.shp

答え3

「Bash の文字列操作」と呼ばれます。

ここには非常に良い教科書があります。
https://tldp.org/LDP/abs/html/string-manipulation.html

関連情報