ls -v(自然数ソート)コマンドは、大文字以外のファイル/ディレクトリの前に大文字のファイル/ディレクトリをソートします。

ls -v(自然数ソート)コマンドは、大文字以外のファイル/ディレクトリの前に大文字のファイル/ディレクトリをソートします。

自然に数字を揃えたいけど大文字のファイル/ディレクトリは一番上に並べ替えられません。それは可能ですか?

現在のls -lv生産:

FOO/
bar/
ZEBRA.x
foo.x
foo-1.x
foo-2.x
foo-10.x

私はめちゃくちゃ|sort ...でしたが、(1)私が試したすべてがうまくいかず、(2)--color=auto私のコマンドからls削除されました。色の解決策があると確信していますが、それが何であるかわかりません。

編集する

私のテストでは、LC_COLLATE=C ls -lと同じことを行いますls -lv

答え1

zsh代わりに、いつでも'snumericglobsortまたはglob修飾子を使用できますn

$ locale title
English locale for Britain
$ print -rC1 -- *(Nn)
bar
FOO
foo-1.x
foo-2.x
foo-10.x
foo.x
ZEBRA.x
$ () { local LC_COLLATE=C; print -rC1 -- *(Nn); }
FOO
ZEBRA.x
bar
foo-1.x
foo-2.x
foo-10.x
foo.x

GNUの使用ls:

ls -U -ld --color -- *(n)

ソートせずにlsglob 拡張子が指定した順序でファイルをリストします。zsh

Cロケールのように、ロケールのソート順が大文字と小文字を区別する場合は、次のこともできます。

$ locale title
ISO/IEC 14652 i18n FDCC-set
$ print -rC1 -- *(Nnoe['REPLY=$REPLY:l'])
bar
FOO
foo-1.x
foo-2.x
foo-10.x
foo.x
ZEBRA.x

式を評価してソートできるように、oeglob修飾子を使用して名前を小文字に書き換えますか?loeREPLY=$REPLY:l e

GNUの場合(バージョンソートのために)sortは(大文字と小文字の区別の一致)と組み合わせること-Vができますが、-fファイル名に改行文字が含まれておらず、ASCII文字としてのみ機能すると仮定します。

$ ls | LC_COLLATE=C sort -Vf
bar
ETE
FOO
foo.x
foo-1.x
foo-2.x
foo-10.x
ZEBRA.x
Á
ÉTÉ
á
été

答え2

並べ替えはlsロケールによって異なりますが、残念ながら、ls -vおよびを使用する場合はこれは考慮されませんsort -V

LC_COLLATE="C" ls -l同じ「問題」を確認してみました。

この機能は、注目すべきいくつかの注意事項があるgnulibのfilevercmp関数を使用して実装されています。

  • LC_COLLATE は無視されます。つまり、「ls -v」と「sort -V」は、LC_COLLATE ロケールカテゴリが「C」に設定されているかのように、数字ではなく接頭辞をソートします。

(通過する)

これはASCIIの順序でソートされることを意味します。

また見なさい:

https://www.gnu.org/software/coreutils/manual/coreutils.html#Version-sort-ignores-locale


ただし、python次の方法を使用してバージョンを並べ替えることができます。

natsortたとえば、次のものを取り付けた場合は、モジュールを取り付けますpip

pip3 install natsort

Pythonスクリプト(たとえばsortv.py)に次のように入力します。

#!/usr/bin/env python3
from natsort import humansorted
import sys
for line in humansorted(sys.stdin):
    print(line.rstrip())

それからls -1f | python /path/to/sortv.py

これは完璧ではありません。ディレクトリとファイルに関係なく、単に何ができるかを示す必要があります。より良いアプローチは、pythonパイプの代わりにすべてを実装することです。ls 決して解析しないでください。

たとえば、

#!/usr/bin/env python3
import os
from natsort import humansorted
for (path, dirs, files) in os.walk('.'):
    for d in dirs:
        print('\033[94m{}\033[0m'.format(d))
    for f in humansorted(f):
        print(f)
    break

関連情報