자연스럽게 숫자를 정렬하고 싶지만대문자 파일/디렉토리는 맨 위에 정렬되지 않습니다.그게 가능합니까?
현재 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
대신 언제든지 's numericglobsort
또는 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