シェルスクリプトでは、変換されたファイル名がまだ存在しない場合は、ファイル名を大文字に変換する必要があります。この特別なケースでは、デフォルト名を大文字に変更し、拡張子(存在する場合)は変更しませんでした。
この問題を解決するための私の考えは、まず基本名と拡張子を別々に抽出し、
tr
コマンドを使用して基本名を大文字に変換し、変更された基本名と拡張子がディレクトリにあることを確認することです。
存在しない場合は、mvを使用して元のファイル名を大文字のデフォルト名に変更します。今、これは2つの方法で行うことができると思います。 1つ目はを使用しexpr
、2つ目はcut
with .
(space-period-space)を区切り文字として使用することです。
基本名を抽出するために使用するにはexpr
(ファイル名python1.py
などphonelist
)、次のように書きました。
basefile=`expr "$filename" : '\(.*\)\.*.*' `
また、ゼロ個以上のエントリが無視されたため、\.*
拡張子なしでそのファイル名を使用しましたが、この式は機能しませんでした。すべてのファイル名に対して完全なファイル名をそのまま返します。\.*
.
expr
誰もが私が間違っている場所を説明できますか?また、expr
ファイル名からのみ拡張子を抽出する方法も提案してください。
ベストアンサー1
シェルがある場合は、bash
bashパラメータ拡張のみが使用されます。
file="aaa.bbb.dat"
name=${file%.*} # delete everything after last dot
ext=${file##*.} # delete everything up to last dot
upcase=${name^^*}.$ext # uppercase everything
echo "$upcase"
AAA.BBB.dat
もう少し難しいことを試してみてください。
file="déjà vu . dat "
name=${file%.*} # delete everything after last dot
ext=${file##*.} # delete everything up to last dot
upcase=${name^^*}.$ext # uppercase everything
echo ":$upcase:"
以下を提供します。
:DÉJÀ VU . dat :
だから:
- 結果を使用する前に二重引用符は必要ありません。
- ASCII以外の文字でも大文字が機能しているようです。