私のディレクトリに次のファイルがあるとしましょう。
_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
あなたが望む順序を与えなければなりませんそしてβ
と表示されますβ
。
使用中のLANG
UTF-8ロケールにβ
設定すると、変更する必要はありません。β
en_US.UTF-8
LANG
コメントの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を使用しています。