web-dev-qa-db-ja.com

bashのglob文字クラスで大文字と小文字を区別するにはどうすればよいですか?

knob_A.pngknob_a.pngのようなファイルをいくつか作成しましたが、Windowsのチームメートは、これが彼女のアプリに問題を引き起こしたと言いました。 knob_W.pngではなくknob_a.pngと呼ぶことにしました。次に、共有サーバーまでrsyncを実行しました。物事をきれいにするために私はそれからしました

rm knob_[a-d]*.png

knob_A.pngも削除しました。これはフットボールのバットとしては間違っています。

shopt -s nocaseglobshopt -u nocaseglobも、希望どおりに動作しません。

昔のようにグロブで大文字と小文字を区別するようにbashに指示するにはどうすればよいですか?

4
Mutant Bob

ここでは、Bashで大文字と小文字が区別されます。問題は、範囲内の文字の並べ替え順序にあります。 Bashマニュアルから(info bash):

範囲式の文字の並べ替え順序は、現在のロケールと、設定されている場合は「LC_COLLATE」シェル変数の値によって決まります。

たとえば、デフォルトのCロケールでは、「[a-dx-z]」は「[abcdxyz]」と同等です。多くのロケールは文字を辞書順にソートします。これらのロケールでは、「[a-dx-z]」は通常「[abcdxyz]」と同等ではありません。たとえば、「[aBbCcDdxXyYz]」と同等である可能性があります。ブラケット式の範囲の従来の解釈を取得するには、「LC_COLLATE」または「LC_ALL」環境変数を値「C」に設定することにより、Cロケールの使用を強制できます。

やってみてください

export LC_COLLATE=C
7
xordspar0

Bashには、パターンマッチを保持するためのシェルオプションがあるため、展開中に大文字と小文字が無視されません。スクリプトにshopt -s globasciirangesを追加して大文字と小文字を区別する一致を有効にし、shopt -u globasciirangesを使用してオフにすることができます。 Bashリファレンス-Shopt Builtin を参照してください。

または、他の回答に記載されているLC_COLLATE=Cを使用することもできますが、export LC_COLLATEを使用して環境にエクスポートされていることを確認してください。

1
DonnieDarko