lsは合理的なソート順序を実行しますが、ギリシャ文字を "??"で印刷しないようにします。

lsは合理的なソート順序を実行しますが、ギリシャ文字を "??"で印刷しないようにします。

私のディレクトリに次のファイルがあるとしましょう。

_y a b c x z β

次のコマンドは、神が意図したように上記の順序でリストします。

perl -e '@files = <*>; print join(" ",sort @files)'

これは私がlsを実行したときに起こることを望むものです。つまり、ギリシャ語のベータを含むすべての項目が正しく表示されることを望み、ファイル名の前の文字が常に後の文字より古い場合など、合理的な順序で表示されることを望みます。 、他の場合。

私のUbuntuシステムでは、lsのデフォルトの振る舞いは次のようなものです。

a b c x _y z β

人間的な感じを与えようとする意図で下線を文字として扱わないからです。私はそのような行動を望んでいません。

これにより、ソートがalias ls='LANG=C ls'ロケールを認識しなくなります。ただし、出力は次のようになります。

_y a b c x z ??

これでギリシャ文字が正しく表示されません。この環境変数により、lsはすべてをシングルバイトASCIIコードとして解釈し、ベータはおそらく印刷できないいくつかの文字の2バイトの組み合わせです。

私が望むようにlsを行う方法はありますか?

答え1

あなたのロケールが希望の順序を提供するen_US.UTF-8場合LC_ALL=C ls

LC_COLLATE=C ls

あなたが望む順序を与えなければなりませんそしてβと表示されますβ

使用中のLANGUTF-8ロケールにβ設定すると、変更する必要はありません。βen_US.UTF-8LANG

コメントの1つは「LANGギリシャ語に設定してLC_COLLATE」を提案しましたC。次の理由であなたの試みがLC_COLLATE="C" LANG="el_EL.UTF-8" ls失敗しました:

  • ギリシャ語ロケールはel_GR.UTF-8、ではありませんel_EL.UTF-8
  • 私が間違っていても、el_EL.UTF-8あなた(あなたのOS)はおそらくテンプレートからローカライズファイルを生成しなかったでしょう。

おそらく両方のファイルを生成していない可能性がありますel_GR.UTF-8。これを行うには、編集して/etc/locale.genコメントを外してel_GR.UTF-8実行する必要がありますsudo locale-gen。これで、LC_COLLATE=C LANG=el_GR.UTF-8 ls機能する準備が整いました。しかし、もう一度申し上げますが、これを行う必要はありません。コンテンツが表示されるen_US.UTF-8のに十分です。必要なのはソート順を変更するだけです。ββLC_COLLATE=C

答え2

マイコンピュータから:

$ env LC_COLLATE=C ls
_y  a  b  c  x  z  β

あなたのコメントで、次のように誤ったロケールを指定したようです(-N出力をコピーする必要があります)。

$ env LC_COLLATE=C LANG="sdjf" ls
 _y   a   b   c   x   z  ''$'\316\262'
$ env LC_COLLATE=C LANG="sdjf" ls -N
_y  a  b  c  x  z  ??

壊れたロケールだけがある場合は、--show-control-chars -N次のフラグを使用できます。

$ env LC_COLLATE=C LANG="sdjf" ls --show-control-chars -N
_y  a  b  c  x  z  β
$ env LANG=C ls -N --show-control-chars
_y  a  b  c  x  z  β

重要な場合は、Ubuntu 20.04.2を使用しています。

関連情報