ディレクトリに次のファイルを作成します。
$ touch .a .b a b A B 你好嗎
私のls
デフォルトの順序は先行ポイントの存在を無視し、それを他のファイルと混在させます。
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
私できる 変化 LC_COLLATE
ドットファイルを最初に入れてください。
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
残念ながら、これはソート順序が大文字と小文字を区別します。つまり、A
andがandの前にB
来ます。大文字と小文字を区別せずに(および前に来る)ドットファイルを最初に印刷する方法はありますか?a
b
A
a
B
b
編集:LC_COLLATEを修正してみてください。
これまでのところ、どんな答えでもeasyの機能を完全に複製することはできませんls
。おそらくこれらのいくつかを関数にラップすることができますが、そのためには、引数なしでディレクトリを引数として提供するのと比較して作業する方法の詳細なコード(例:)を含める必要があります。または明示的なフラグを処理する方法-d
。
それとも、より良いLC_COLLATE
選択肢があるかもしれないと思いました。しかし、私はこれができないようです。私は現在使用していますLC_COLLATE="en_AU.UTF-8"
。/usr/share/i18n/locales/en_AU
(たとえこれへの参照を見ることができないので、これが正しいファイルであるかどうかはわかりませんがUTF-8
)、次のことがわかりました。
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
を含みますcopy "iso14651_t1_common"
。/usr/share/i18n/locales/iso14651_t1_common
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
この行を削除し、sudo locale-gen
コンピュータを実行して再起動しました。残念ながら、これは何も変更しません。
ベストアンサー1
OPはクリップに非常に近いですが、/usr/share/i18n/locales/iso14651_t1_common
トリックはそうではありません。削除ワイヤー
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
代わりに、次のように修正してください。
<U002E> <RES-1>;IGNORE;IGNORE;<U002E> # 47 .
これがうまくいく理由
IGNORE
これらのステートメントは、単語をアルファベット順に並べ替えるときにピリオド(ピリオドまたは文字とも呼ばれる)が無視されることを指定します。<U002E>
ドットファイルを最初に表示するには、IGNORE
他のすべての文字の前にある組み合わせ記号に変更します。対照記号は、次のような線で定義されます。
collating-symbol <something-inside-angle-brackets>
線の形状に合わせて整列されます。
<something-inside-angle-brackets>
私のコピーでは、iso14651_t1_common
最初の対照記号は<RES-1>
3458行に表示されます。ファイルが異なる場合は、最初にソートされる組み合わせ記号を使用してください。
文字ソートのためのLC_COLLATEの使用に関する追加情報
<U002E>
IGNORE
同点の場合、文字を複数回比較できるため、3つの文があります。これを理解するには、小文字a
と大文字A
(実際には4回比較される文字セットの一部)を検討してください。
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
複数のラウンドを比較すると、「a」と「A」で始まるファイルをまとめてグループ化できます。どちらも<a>
最初のステップで比較され、次の文字によって順序が決定されるためです。後のすべての文字が同じ場合(たとえば、およびa.txt
)、小文字の照合が大文字の照合(3488行)の前に行3467に表示されるため、3番目のA.txt
パスが最初に続きます。a.txt
<MIN>
<CAP>
この変更を実装してください。
月経を先にしたいなら毎回プログラムは文字をソートするために使用され、上記のように場所ファイルを変更して再作成LC_COLLATE
できます。iso14651_t1_common
しかし、そのような変化が欲しいならただルートにアクセスするかどうかにかかわらls
ず、元のロケールファイルを変更する前に別のディレクトリにコピーできます。
私がしたこと
私のデフォルトのロケールはen_USなのでen_US
、iso14651_t1
とをiso14651_t1_common
コピーします$HOME/path/to/new/locales
。そこで上記のように変更してiso14651_t1_common
名前を .Nexten_US
に変更しen_DOTFILE
ました。 en_DOTFILE ロケールをコンパイルしました。
localedef -i en_DOTFILE -f UTF-8 -vc $HOME/path/to/new/locales/en_DOTFILE.UTF-8
デフォルトls
の順序を変更するには、次のBASHスクリプトを作成しますls
。
#!/bin/bash
LOCPATH=$HOME/path/to/new/locales LANG=en_DOTFILE.UTF-8 ls "$@"
パスに表示される前にどこかに保存し/usr/bin
て実行可能にしますchmod +x ls
。