
ディレクトリに次のファイルを作成します。
$ 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
。
答え2
シェルのソート順序(ロケールのソート順序とは関係がない可能性がありますbash
。大文字と小文字を区別しない順序を提供しているように見えますが、ASCIIではない場合は、別の結果(文字)が表示されます。ksh
yash
tcsh
zsh
mksh
dash
fish
ls -dUl -- .* *
これは、ソートが無効になっている(GNU拡張子)ls
リストするファイル(およびディレクトリ)の明示的なリストを提供します。ls
-U
使用するシェルに応じていくつかの注意事項があります。
- デフォルトオプションを使用すると、ディレクトリに隠しファイルと非隠しファイルがない場合、
zsh
コマンドは失敗します。これを防ぐにはnomatch
無効にすることができますが、代わりにこれを実行することをお勧めします(完全に一致するものがない場合のみ)。以前のUnixシェルのようにコマンドが失敗します。nomatch
set -o cshnullglob
(t)csh
- これは、その拡張と
zsh
そのpdksh
派生物と秋fish
とを含まないため、一致します。他の殻と並置されて一致します。後者の場合と()を除外するようにワイルドカードパターンを変更する必要があります。.*
.
..
ls -Al
.
..
ls -al
.
..
ls -dUl -- ..?* .[!.]* *
fish
ワイルドカードパターンが、(t)csh
または以外のzsh
項目と一致しない場合、エラーls
メッセージが生成されます。nullglob
オプションを設定するか、()にリダイレクトすることでこれを防ぐことができます。を使用している場合に発生する可能性のある驚くべき動作に注意してください(参照:bash
zsh
stderr
/dev/null
ls -dUl -- ..?* .[!.]* * 2>/dev/null
nullglob
シェルは「?」文字を食べる)。対話時に一致しない各globに対して警告メッセージが表示されることを除けば、同様に動作しfish
ます。bash
nomatch
(ありがとうスティーブン・チャジェラスすべてのフィードバックのために! )
答え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