大文字と小文字を区別せずに、最初に「ls」でドットファイルを表示するにはどうすればよいですか?


21

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

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

残念ながら、これはソート順、大文字と小文字を区別し、すなわち作るABに先行aしてb。大文字と小文字を区別しない(滞在しながら最初のドットファイルを印刷する方法があるAaに先行Bしてはb)?

編集:LC_COLLATEを変更しようとしています

これまでのところ、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して実行し、コンピューターを再起動しました。残念ながら、これは何も変わりませんでした。

回答:


11

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は、1位の照合シンボルは<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.txtandなどA.txt)、a.txt小文字の照合記号が<MIN>3467行目に現れ、大文字の照合記号<CAP>(3488行目)の前に3番目のパスが最初に置かれます。

この変更を実装する

プログラムがを使用してレターを注文するたびに期間が最初になるようにしたい場合は、上記のようにLC_COLLATE変更iso14651_t1_commonしてロケーションファイルを再構築できます。ただし、ルートアクセスのみを使用してこの変更を行うls場合は、変更する前に元のロケールファイルを別のディレクトリにコピーできます。

私がしたこと

私のデフォルトのロケールは、私がコピーされたので、en_USですen_USiso14651_t1iso14651_t1_commonします$HOME/path/to/new/locales。そこで、上記の変更をiso14651_t1_common行い、名前en_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ます。


もちろん、あなたがあなたのドットファイルを見るために-aまたは-Aを追加する必要がありますが、あなたは常にそれらを見たいと思っていない限り、それはない、あなたのbashスクリプトでは、コマンドラインでそれを行うことは理にかなって
beandip

ブリリアント!ありがとう、これは完璧です!ルート所有ファイルを変更したばかりなので、スクリプトをテストしませんでした。ただし、を二重引用符で囲む必要があると思います$@
-Sparhawk

良い電話-二重引用符を追加
-beandip

11

;あなたは、ロケールの照合順序関与していない可能性がある(代わりにシェルのソート順を使用することができbash、AT&T kshyashtcshzsh期待される結果が得られ、mkshそしてdashません。fish大文字小文字を区別しない順序を与えているようだが、非ASCIIがある異なった結果が得られます文字):

ls -dUl -- .* *

これによりls、リストするファイル(およびディレクトリ)の明示的なリストが提供され、lsの並べ替え(-UGNU拡張機能である)が無効になります。

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

  • を使用すると、ディレクトリに隠しファイルと非隠しファイルの両方が含まれていない場合zsh、デフォルトnomatchオプションによりコマンドが失敗します。これnomatchを避けるために無効にすることもできますが、set -o cshnullglob代わりに行う方が良いでしょう(そして、コマンドは、グロブがin (t)cshまたは初期のUnixシェルのように一致しない場合にのみ失敗します)。
  • ではzshpdkshおよびその誘導体とfish.*の拡張含まれていない...、この試合は、そうls -Al。他のシェル.と一緒に..含まれているので、一致しls -alます。後者のケースでは、除外するグロブパターンを変更する必要があるだろう...ls -dUl -- ..?* .[!.]* *)。
  • fish(t)cshまたはを除きzsh、グロビングパターンのいずれかが何にも一致しない場合ls、エラーメッセージが生成されます。あなたが設定することで、このいずれかを避けることができるnullglobオプションを(中bashzsh、あるいはリダイレクトすることによって、少なくとも)stderr/dev/nullls -dUl -- ..?* .[!.]* * 2>/dev/null)。を使用する場合nullglob、原因となる可能性のある驚くべき動作に注意してください(シェルが「?」文字を食べる参照)。対話型の場合、一致しないグロブごとに警告メッセージが発行されることを除いて、とfish同様に動作します。bashnomatch

(すべてのフィードバックに対してStéphaneChazelasに感謝します!)


すべてのシェルがロケールの照合順序を使用してリストをソートするわけではないことに注意してください。mkshまたdash、たとえば、大文字と小文字を区別せずにソートしません。
ステファンシャゼル16年

1
-U(ソートされていないことを意味する)はGNU拡張機能であることに注意してください。lsFreeBSDのような他のいくつかの実装にはがありますが、-Uソートされていないリスト用ではありません。
ステファンシャゼル16年

GNUではls、あなたが必要とする--前に.*(POSIXLY_CORRECTが環境にある場合を除き)その実装として引数の後にオプションを受け付けます
ステファンChazelas

卑劣(+1)!ただし、すべての場合、つまりエイリアスまたは関数でこれをどのように簡単に使用するかはわかりません。たとえば、特定のディレクトリをls引数として指定する場合、変更する必要があります。
-Sparhawk

1
@PeterCordes [!.]は正しいです。pubs.opengroup.org/onlinepubs/9699919799/utilities/…を参照してください。いくつかの(ほとんどの?)シェル^!、否定文字クラスグロブの同義語として使用できます。いずれにせよ、私が好む.[!.] .??* *よりもわずかにより理解として.[!.]* ..?* *
jrw32982はモニカサポートして

4

次の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

+1もありますが、StephenKittの答えによると、すべての場合、つまりエイリアスや関数でこれをどのように簡単に使用できるかわかりません。たとえば、特定のディレクトリをls引数として指定する場合、変更する必要があります。(FWIW私はzshを使用していますが、これはbash-peopleに役立つと思います。)
Sparhawk

-2

lsコマンドオプションで遊ぶことができます。これを試して:

# 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

申し訳ありませんが、それは私がしたいことをしていないようです。-Xフラグは、後の拡張によってソート.全く異なっています。また、ファイルはアルファベットの逆順です。また、私の例ではドットファイルが最初ですが、すべての場合で機能するわけではありません(例:)a.b c.d .a .c。また、の-a代わりに使用しました-A
-Sparhawk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.