大文字と小文字を区別せずに「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

答え2

シェルのソート順序(ロケールのソート順序とは関係がない可能性がありますbash。大文字と小文字を区別しない順序を提供しているように見えますが、ASCIIではない場合は、別の結果(文字)が表示されます。kshyashtcshzshmkshdashfish

ls -dUl -- .* *

これは、ソートが無効になっている(GNU拡張子)lsリストするファイル(およびディレクトリ)の明示的なリストを提供します。ls-U

使用するシェルに応じていくつかの注意事項があります。

  • デフォルトオプションを使用すると、ディレクトリに隠しファイルと非隠しファイルがない場合、zshコマンドは失敗します。これを防ぐにはnomatch無効にすることができますが、代わりにこれを実行することをお勧めします(完全に一致するものがない場合のみ)。以前のUnixシェルのようにコマンドが失敗します。nomatchset -o cshnullglob(t)csh
  • これは、その拡張とzshそのpdksh派生物と秋fishとを含まないため、一致します。他の殻と並置されて一致します。後者の場合と()を除外するようにワイルドカードパターンを変更する必要があります。.*...ls -Al...ls -al...ls -dUl -- ..?* .[!.]* *
  • fishワイルドカードパターンが、(t)cshまたは以外のzsh項目と一致しない場合、エラーlsメッセージが生成されます。nullglobオプションを設定するか、()にリダイレクトすることでこれを防ぐことができます。を使用している場合に発生する可能性のある驚くべき動作に注意してください(参照:bashzshstderr/dev/nullls -dUl -- ..?* .[!.]* * 2>/dev/nullnullglobシェルは「?」文字を食べる)。対話時に一致しない各globに対して警告メッセージが表示されることを除けば、同様に動作しfishます。bashnomatch

(ありがとうスティーブン・チャジェラスすべてのフィードバックのために! )

答え3

単に2つの別々のコマンドを使用できますls

$ ls -dl ..?* .[^.]* 2>/dev/null ; ls -dl *
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 .a
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 .b
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 a
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 A
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 b
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 B
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 你好嗎

これまでの他の回答とは異なり、この方法ではドットファイルを最初に表示し、回避と項目を表示し、残りの.項目..をアルファベット順に表示します。ls

同じ結果を得るために、@StephenKittの答えを改善することができます。

$ ls -dUl ..?* .[^.]* * 2>/dev/null

答え4

あなたは実行することができますエルエスコマンドオプション。この試み:

# ls -laXr

どこ:

-l     use a long listing format
-a, --all
              do not ignore entries starting with .
-X     sort alphabetically by entry extension
-r, --reverse
              reverse order while sorting

関連情報