大文字と小文字を区別せずに「ls」にドットファイルを最初に表示させる方法は?

大文字と小文字を区別せずに「ls」にドットファイルを最初に表示させる方法は?

ディレクトリに次のファイルを作成します。

$ 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 你好嗎

残念ながら、これはソート順序が大文字と小文字を区別します。つまり、Aandがandの前にB来ます。大文字と小文字を区別せずに(および前に来る)ドットファイルを最初に印刷する方法はありますか?abAaBb

編集: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_USiso14651_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

おすすめ記事