"ls"의 정렬 순서를 관리하는 개행 앞에 문자 정렬이 있습니까?

"ls"의 정렬 순서를 관리하는 개행 앞에 문자 정렬이 있습니까?

저는 일부 파일 명명 지침을 작성 중이며 최종 개정 전에 초안 문서를 나열할 수 있는 방법을 찾으려고 노력하고 있습니다.

예: 현재 내 명명 규칙은 다음과 같습니다.

contract_foo_v1
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v2
contract_foo_v2~draft1

문제는 v1~draft가 나열되어야 한다는 것입니다.앞으로v1(최종 개정). 다음과 같이 사용할 수 있는 문자가 있나요?

contract_foo_v1?draft1
contract_foo_v1?draft2
contract_foo_v1
contract_foo_v2?draft1
contract_foo_v2

또한 로캘과 프로그램에 차이가 있을 수 있다는 점을 이해하므로 대부분의 경우(또는 가능한 한 많은 경우)에 필요한 대로 작동하는 캐릭터에 대한 조언을 구하고 있습니다. 도움을 주셔서 감사합니다.

답변1

ls귀하의 경우 개행 문자가 포함되지 않은 파일 이름을 기준으로 파일 목록을 정렬하십시오. 심지어 sort정렬콘텐츠개행 문자가 포함되지 않은 줄이므로 정렬 가능한 문자를 찾는 것이 아닙니다.줄 바꿈 전에, 하지만 정렬된 것아무것도 없기 전에그리고 당신은 그것을 찾을 수 없습니다.

이제 GNU ls -v(버전 정렬용)는 원하는 순서대로 파일 목록을 정렬합니다.

$ ls -v1
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

그렇지 않은 경우 -v에는 ls어휘 정렬 로 인해 v10먼저 정렬됩니다 v2.

GNU를 사용하면 출력에 다음을 사용할 sort수도 있습니다 (파일 이름에 개행 문자가 포함되어 있지 않다고 가정).sort -Vls

$ ls | sort -V
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

POSIXly에서는 다음과 같이 할 수 있습니다.

$ ls | sort -t'~' -k1.15,1n -k2,2.1r -k2n
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

하지만 이는 버전 이전 부분의 길이가 항상 14자라고 가정합니다.

zsh셸을 사용하면 다음과 같이 전역 정렬 순서를 정의할 수 있습니다.

drafts_first() {
  [[ $REPLY = *'~draft'* ]] || REPLY="$REPLY~release"
}
printf '%s\n' *(no+drafts_first)

문서당 버전이 999개 이하이고 버전당 초안이 99개 이하라고 가정하고 파일 이름을 지정할 수도 있고 contract_foo_v001_draft01( contract_foo_v001_release또는 contract_foo_v001_final@Kusalananda가 제안한 대로 뒤에 오는 단어가 무엇이든 ) 선택할 수도 있습니다. draft올바른 순서로 ls어휘 순서로 파일을 나열합니다 .

ls -rt수정 시간(최신 마지막) 또는 glob 한정자를 기준으로 Om파일 정렬 도 참조하세요 zsh.

이제 이러한 파일 이름에 확장명(예: )을 추가하면 .pdf완전히 다른 이야기가 됩니다.

$ LC_ALL=en_US.UTF-8 ls -1
contract_foo_v10.pdf
contract_foo_v1~draft1.pdf
contract_foo_v1~draft2.pdf
contract_foo_v1.pdf
contract_foo_v2~draft1.pdf
contract_foo_v2.pdf
$ LC_ALL=C ls -1
contract_foo_v1.pdf
contract_foo_v10.pdf
contract_foo_v1~draft1.pdf
contract_foo_v1~draft2.pdf
contract_foo_v2.pdf
contract_foo_v2~draft1.pdf

en_US.UTF-8로케일 에서는 ~첫 번째 비교에서 및 둘 다 무시되므로 정렬이 앞에 오기 때문에 앞에 오고 정렬이 앞에 오기 때문에 앞에 옵니다(이것은 확장과 다릅니다)..v10v1~d0dv1~draftv1.pdfdraftpdf.docx

C 로케일에는 패스가 하나만 있으며 정렬은 바이트 값을 기준으로 해당 순서대로 .정렬 됩니다 . ASCII에서 인쇄 가능한 가장 높은 값의 문자이므로 최악의 선택입니다. 앞에 ,,,all 과 같이 많이 있습니다.0~~.#-%무시당하다위의 첫 번째 단계에서는 iso14651_t1 다음 로케일에서 수행됩니다.

따라서 v2 대 v10 문제를 해결하기 위해 0 패딩을 사용하고 -대신 , 확장을 사용하면 원하는 순서를 얻을 수 있습니다 ~..pdf인류로케일 및 C/ C.UTF-8로케일에서 순서는 코드 포인트를 기반으로 합니다.

$ LC_ALL=en_US.UTF-8 ls -1
contract_foo_v01-draft1.pdf
contract_foo_v01-draft2.pdf
contract_foo_v01.pdf
contract_foo_v02-draft1.pdf
contract_foo_v02.pdf
contract_foo_v10.pdf
$ LC_ALL=C ls -1
contract_foo_v01-draft1.pdf
contract_foo_v01-draft2.pdf
contract_foo_v01.pdf
contract_foo_v02-draft1.pdf
contract_foo_v02.pdf
contract_foo_v10.pdf

관련 정보