このfindコマンドがASCII以外の文字のみを含むファイル名を返さないのはなぜですか?

このfindコマンドがASCII以外の文字のみを含むファイル名を返さないのはなぜですか?

findこのコマンドが機能しない根本原因を確認しようとしています。以下に呼び出されたファイルと一致しないでくださいthis_should_not_match

$ > find . -type f -name "*[^ -~]*"
./__º╚t
./this_should_not_match
./__╞_u
./__¡VW
./__▀√Z
./__εè_
./__∙Σ_
./__Σ_9
./__Σhm
./__φY_

私のシェルはBash 3.2です。

答え1

範囲はCロケールでのみ安定して移植可能に機能します。他のロケールではいくつかのバリエーションがありますが、通常、文字はいくつかの並べ替え[x-y]順序(実際には文字順序と一致する可能性がある組み合わせ要素)に従って前後に並べ替えられます。これは一般的にあいまいで、常に使用されているものと同じではありません。xysort

Cロケール(参照:「LC_ALL = C」は何をしますか?)、文字はバイトで、範囲は文字のコードポイント(バイト値基準)に基づいています。

LC_ALL=C find . -type f -name "*[^ -~]*"

ASCIIベースのシステム(ほとんど; POSIXは、CロケールがASCII文字セットを使用することを保証しませんが、実際には特別なEBCDICベースのIBMメインフレームオペレーティングシステムを使用しない限り)、ASCII)を使用すると、名前が32から126の間のバイト以外のバイトを含む一般ファイルをリストします。

さらに、マルチバイト文字ロケール(現在の標準であるUTF-8ロケールなど)では、*一部のシステムで有効なバイトシーケンスを形成しない文字と一致しないため、すべてのファイル名を一致させることは不可能かもしれません。

関連情報