自然に数字を揃えたいけど大文字のファイル/ディレクトリは一番上に並べ替えられません。それは可能ですか?
現在の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)
ソートせずにls
glob 拡張子が指定した順序でファイルをリストします。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
式を評価してソートできるように、oe
glob修飾子を使用して名前を小文字に書き換えますか?l
o
e
REPLY=$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