同じレベルの他のファイルやディレクトリと区別したい場合は、アンダースコアプレフィックスを使用してファイルとディレクトリに名前を付けることができます。たとえば、Windows と Mac でファイルの前にアンダースコアを付けると、ファイルは英数字で始まるファイルよりも上にソートされます。
私のインターネット検索はLC_COLLATEと現在のロケール(en_US)に関連していることがわかりました。大丈夫です。 en_USが期待どおりにソートされていない理由を本当に理解していなくても。
に基づいてICUコレートデモシーンロケールをen_US_POSIXに設定すると、間違いなく私が探しているソート順序があるようです。テストするには、サンプルデータを編集して下線を追加する必要があります。しかし、Linuxシェルに適用する方法がわかりません。
理想的には、lsが常に下線を最初にソートするようにbash設定で何かを設定できることを願っています。どうすればいいですか?
答え1
小文字と大文字を混在させたくない場合は、ロケールをに設定してください。これにより、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_COLLATE
。LC_NUMERIC
適切な辞書の順序付けはLC_COLLATE
予想よりも複雑であり、正規表現で文字範囲を使用すると、あらゆる種類の奇妙な動作を引き起こす可能性があります。LC_NUMERIC
いくつかのプログラムは.
。
答え2
ls
必要に応じてソートできない場合は、シェルを拡張してみてください。
ls
ソートされたファイルのリストからシェルを実行するためにファイル名パターンを使用ls
する方法をバイパスできます。
ls -lf _* [!_]*
ファイルがあると仮定すると
_a a _b b _c c
まるで走っているようです。
ls -lf _a _b _c a b c
説明する:
_*
アンダースコアで始まるすべてのファイル名と一致し、アルファベット順に拡張されるシェルパターン。
[!_]*
すべてのファイル名と一致いいえ下線で始まり、アルファベット順に展開します。
-f
ls
言ういいえシェルがすでにこれを行っているので、ソートされました。
追加情報:bash ファイル名拡張子
現在のディレクトリにディレクトリがある場合、lsがディレクトリ内のファイルを一覧表示しないように、次のコマンドを実行する必要があります。
ls -lfd _* [!_]*
答え3
残念ながら、Linuxはロケール情報を取得するためにICUではなくglibcを使用しているため、ICUをglibcに適用したり、glibcのロケール情報を補完するなど、かなりの努力がなければLinuxに直接適用することはできません。
答え4
ソートせずにスイッチを追加すると、-f
次のようになります。
man ls
[root@dusknoir ~/java/test]# ls -fl
total 0
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 _1
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 _2
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 _3
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 1
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 2
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 3