Mac OSXでの大文字と小文字を区別しないlsソート


30

lsMax OS X Lionでコマンドを作成して、Ubuntu Linuxと同じようにファイルとディレクトリを並べ替えることができます(大文字と小文字を区別しない、ディレクトリが上にない、ドットファイルが上にない)。理想的には、sortなどの別のコマンドに出力をパイプすることなくこれを実行したいと思います。

たとえば、私は見たい:

foo
Foobar
MyStuff/
.stuff/
test.txt

の代わりに:

.stuff
Foobar
MyStuff/
foo
test.txt

Linuxでは、lsソート順はシステムのロケール、特にによって制御されますLC_COLLATE。の場合LC_COLLATE=en_US.UTF-8、lsは項目を希望どおりにソートします。の場合LC_COLLATE=ClsOS Xと同様にソートされます。

LC_COLLATEen_US.UTF-8OS Xではに設定されていますが、lsそれでも古いPOSIX方法で並べ替えられます。これをLinuxのように振る舞わせる方法を知っている人はいますか?


役立つ場合:apple.stackexchange.com/a/22304/8546は、HFS Plusが通常、大文字と小文字を区別しない大文字と小文字を保持するように構成されていることを観察しています。
グラハムペリン

回答:


16

それは不可能かもしれません:

lsソースコードを見ると、strcollを使用してファイル名を並べ替えているため、LC_COLLATEを尊重する必要があります。

オンラインでのいくつかの投稿は、BSD(およびDarwin / OS X)のロケールがLinuxのロケールと比較して多少壊れていることを示唆しています。ロケールを明示的に設定し、自分のマシン(Mac OS 10.6.3)と大学のマシン(Linux、FC11?)でen_US.UTF-8とCの両方のロケールを使用してテストする独自のクイックソートプログラムを作成しました。Linuxマシンではソートは期待どおりに機能しますが(「a B c」対「B a c」)、Macは常に「B a c」としてソートします。

ソース:http : //ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

元の回答

このコマンドはドットファイルをソートしませんが、追加のディレクトリリストを表示します

ls -f1 

私はこれに近づきました:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
興味深いことに、-fオプションを使用して「並べ替えを無効にする」ことは、実際に期待どおりに並べ替えられるようです。これは、ファイルシステム/ HFS +がより自然な照合を持つエントリをソートしていることを前提としています。
ジェリー

6

私はこれが回答されていることを知っていますが、これは私にとって最高の仕事です:

ls -f1 -alF -G

すべての詳細をリストし、大文字小文字を無視してソートします。


4

これはしばらくの間私を悩ませていました、そして、私は最終的にそれをソートしました(へ)。うまくいかなかった多くの提案を試した後、ここで何ができましたか。

MacPorts(またはHomebrew、またはFink)をインストールする場合は、GNUバージョンのlsが望みどおりに機能します。私は自分でMacPortsを使用しているので、これが私が説明するアプローチです。

  1. MacPortsをダウンロードしてインストールします。

    http://www.macports.org

  2. GNU Coreutilsパッケージをインストールします。

    sudo port install coreutils

  3. GNU ls:ができましたgls。大文字と小文字の両方で始まる項目を含むディレクトリで試してください。

    gls -U

    (この-Uオプションは実際には「ソートされていない」という意味ですが、OS Xでは大文字と小文字を区別しないという望ましい効果があります。)

  4. このエイリアスをに追加して.bash_profile、レギュラーlsが希望どおりに機能するようにします(カラー出力は気に入っていますが、必要に応じて省略できます。必要なのはのみです-U)。

    alias ls='gls -U --color'

この-Uオプションはおそらく他のプラットフォームでは機能しないことに注意してください。OS Xでは、常に正しいことをしているようです(おそらくHFS +は事実上大文字と小文字を区別しないためです-技術的には「大文字と小文字を区別する」)まったくソートされています。


1
3.新しいAPFSにより、macOS> = 10.13では、望ましい副作用(-Uオプション)がもうないようです。
マリウスホファート

1
うん... APFSでこれを行う方法はないようです。
ジェイソンシムズ

ただし、10.12で動作することを確認します。ありがとう!
パニック大佐

4

マイクが上で書いたことに加えて、私はそれをもう少し詳しく見て、独自の照合規則を定義する方法を見つけました。

ロケール定義は/ usr / share / locale /にあります。各フォルダーはロケールであり、ファイル(またはリンク)LC_COLLATEがあります。これは、どのシンボルが「同じ」かを定義します(たとえば、注文時にU、u、üは同じと見なされる必要があります)。ディレクトリを複製すると、新しいロケール定義が作成されます。

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

これで、 'en_GB.UTF-8-CI'(大文字と小文字を区別しない場合は 'CI')という新しいロケールが作成され、そこからLC_COLLATEを使用できます。

これで、新しいロケールのLC_COLLATEを変更するために、http: //www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/からロケールソースをダウンロードできます それはあなたが望んで実行するものに最も近い

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

そして今あなたが走るとき

$ LC_COLLATE=en_GB.UTF-8-CI ls

ルールに従ってソートすることになります

はい、これは「ls」ソートで大文字と小文字を区別しないようにするために必要なことです。


2

回避策として、関数とエイリアスを使用できます。

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

これにより、標準のlsコマンドの大文字と小文字を区別しないでソートされた出力が生成されます。


1
注意する必要があります。たとえば-lを使用すると、これは失敗します。次に、lsは先頭に別の行「total X」を生成し、これもソートされます。
アルネ

2

を使用して

ls -f

私のために働く。

-fは、すべてのソートを公式にオフにしますが、元のHFSソートが輝いているように見えます。これは、大文字と小文字を区別しないソートです。

実際には、HDフォーマットで大文字と小文字が区別されるかどうかによって異なりますが、大文字と小文字を区別しないHFS形式がMac OS Xシステムディスクのデフォルトであるため、これは大多数のユーザーで機能するはずです。


これは間違いなく正しい答えです。唯一の問題は、暗黙的に-aもオンにすることです。これをオフにする方法はなく、ピリオドで始まるファイル/フォルダーが表示されます。および..。
lensovet

1
もう1つの問題(現在)は、新しいAPFSのためにmacOS> = 10.13ではもう動作しないように見えることです。
マリウスホファート

1

マイクの答えに触発されて、以下を/ etc / bashrcに追加しました。これはMojaveで美しく機能します。-aが追加されたときに最後に隠しファイルをリストしますが、それは気にしません。

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

localeコマンドを実行して、新しい構成を確認できます。元に戻すには、/ etc / bashrcから行を削除して、ターミナルに再度ログインします。

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Mojaveではls -f1もls -fも機能しなかったことに注意してください。最終的には分類されていないリストになりました。私が提供したソリューションのみがMojaveで機能しました。


最良の答えですが、与えられた例はやりすぎです。次の行を.bashrcorに入れてください.zshrcalias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

実行:

$ type ls

おそらく、lsコマンドがエイリアスされていることに気付くでしょう。


Linuxの場合:ls is /bin/ls。OS Xの場合:ls is hashed (/bin/ls)。いずれにしても、/bin/ls直接呼び出してもLC_COLLATEに従ってソートされません。

2
それは驚くべきことです、あなたのlsコマンドがを含むようにエイリアスされたことを賭けたでしょう--group-directories-first。エイリアスではなく、別の場所で行われる可能性があります。
MikeyB

0

主にドットファイルの並べ替え順序に関心がある場合は、拡張子で並べ替えることができます。GNUFileutilsのオプションを使用してlsコマンドを使用します。(GNU Fileutilsはmacportsなどからインストールできます。)--sort=extension


0

lsはLC_COLLATEに従ってソートしています。LC_COLLATEファイルのほとんどすべてが大文字と小文字を区別してソートするように設定されているだけです。 http://collat​​ion-charts.org/fbsd54/

大文字と小文字を区別しないソート用に設定されている2つがあります。cs_CZ.ISO8859-2とet_EE.ISO8859-15 et_EE.ISO8859.15は、英語のスピーカーが望むように「Z」をソートしません。cs.CZ.ISO8859-15はアルファベットでうまく機能します。アルファベット文字の前に「〜」を並べ替えたいと思います。

私の解決策は次のとおりです。LC_COLLATE= cs_CZ.ISO8859-2 / bin / ls -FG

カスタムLC_COLLATEファイルを作成して「。」を処理できるかどうか疑問に思います。あなたが望む方法と「〜」私が望む方法。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.