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대신 언제든지 '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)

정렬하지 않고 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

관련 정보