web-dev-qa-db-ja.com

最初にlsでアンダースコア文字をソートするにはどうすればよいですか?

同じレベルの他のファイルやディレクトリとは別にしたい場合は、アンダースコアのプレフィックスを付けてファイルやディレクトリに名前を付けることができるのが好きです。たとえば、WindowsとMacでは、ファイルの先頭にアンダースコアを付けると、英数字で始まるファイルの前で、ファイルが先頭に並べ替えられます。

私のグーグルは、LC_COLLATEと私の現在のロケール(en_US)に関係していることが判明しました。それは問題ありませんが、なぜen_USが期待どおりにソートされないのかは本当にわかりません。

ICU Collat​​eデモンストレーションサイト に基づいて、ロケールをen_US_POSIXに設定すると、確かに私が探しているソート順のように見えます(サンプルデータを編集して、アンダースコアを追加してテストする必要があります)。しかし、これを自分のLinuxシェルに適用する方法は本当にわかりません。

理想的には、lsが常にアンダースコアを最初にソートするように、bash構成で何かをセットアップできるようにしたいと思います。これを行うにはどうすればよいですか?

20
Tom Auger

lsで希望どおりに並べ替えられない場合は、シェル展開を試してください。

ファイル名パターンを使用すると、lsが使用するメソッドをバイパスし、シェルが既に並べ替えたファイルのリストを使用してlsを実行できます。

ls -lf _* [!_]*

あなたがファイルを持っていると仮定します

_a a _b b _c c

これは走るようなものです

ls -lf _a _b _c a b c

説明:

_*は、アンダースコアで始まるファイル名に一致するシェルパターンで、アルファベット順に展開されます。

[!_]*は、アンダースコアで始まり、アルファベット順に展開された任意のファイル名に一致しますnot

-flsにソートをしないように指示します。

詳細: bashファイル名の展開

現在のディレクトリにディレクトリがある場合、次のようなコマンドを実行して、ディレクトリ内のファイルのlsリストを回避する必要があります。

ls -lfd _* [!_]*
5
Mikel

小文字と大文字を混在させたくない場合は、ロケールをCに設定します。これは、文字を番号順に受け取ります。 _は大文字と小文字の間にあります。

$ LC_COLLATE=C ls    
BAR  FOO  _score  _under  hello  world
$ LC_COLLATE=en_US ls                    
BAR  FOO  hello  _score  _under  world

ロケール設定LC_MESSAGES(エラーメッセージの言語)、LC_CTYPE(文字セット)、LC_TIME(日付と時刻の形式)は非常に便利です。 LC_COLLATELC_NUMERICは通常、必要以上に問題が多いため、設定しないことをお勧めします。適切な辞書式ソートは、LC_COLLATEで指定するよりも複雑であり、正規表現で文字範囲を使用すると、あらゆる種類の奇妙な動作を引き起こす可能性があります。 LC_NUMERICは、一部のプログラムが.以外の小数点記号付きの数値を生成したために何かがひどくうまくいかない場合を除いて、ほとんど化粧品です。

残念ながら、LinuxはICUではなくglibcをロケール情報に使用しているため、ICUをglibcに組み込むか、glibcのロケール情報を補足するという多大な労力を費やすことなく、これを直接Linuxに適用する方法はありません。 。