3

éこのコマンドを実行した文字でファイルを一覧表示したい:

ls -l | grep é

結果はありません。ディレクトリの内容:

-rw-r--r--  1 user  staff     5020  3 may 11:48 begin
-rw-r--r--  1 user  staff     0 13 jun 08:47 canté
-rw-r--r--  1 user  staff     0 13 jun 08:47 centré
-rw-r--r--  1 user  staff     5020  3 may 11:48 end

ロケール構成

LANG="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_CTYPE="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_ALL=

Mac OsX10.7.3でコマンドを実行します。何か間違えている?

4

2 に答える 2

5

「é」のような文字は、Unicode では 2 つの異なる方法で表すことができます。これは、1 つの構成済み Unicode 文字 (LATIN SMALL LETTER E WITH ACUTE U+00E9) にすることも、2 つの文字 (LATIN SMALL LETTER E U+0065 の後に COMBINING ACUTE ACCENT U+0301 が続く) として分解することもできます。

Mac OS X では、ファイル システム API は常に、Normalization Form D (NFD) の特別なバリアントに正規化されます。適切な NFD では、分解できる文字はすべてです。Mac OS X ファイル システム API で使用される NFD のバリアントでは、レガシー ボリュームとの下位互換性のために、一部の文字が事前に構成されたままになっています。

とにかく、ターミナルに入力された文字のフォームは、によって出力されるフォームとは異なると思われlsます。と の違いを比較しls -l | hexdump -Cますecho -n é | hexdump -C。(どちらの場合も、UTF-8 を取得します。したがって、U+00e9 は c3 a9 として表示され、U+0065 U+0301 は 65 cc 81 として表示されます。)


更新:少しテストしたところ、これが機能することがわかりました:

ls -l | grep $(printf "e\xcc\x81")

これは、sarnold の提案に似ていますが、次のようにも機能します。

ls -l *$(printf "e\xcc\x81")*

基本的にprintf、ファイル名で使用される正確なバイト シーケンスを入力する手段として、サブシェルで使用しています。通常の方法で文字を入力すると、一致しない別のバイト シーケンスが生成されます。

于 2012-06-14T22:06:07.237 に答える
1

私はうまくいく解決策を見つけました:

ls -l | iconv -f UTF-8-MAC -t UTF-8 | grep é
于 2012-06-15T06:31:53.890 に答える