zsh의 사전 순서 다중 비트 파일 범위

zsh의 사전 순서 다중 비트 파일 범위

globbing을 통해 zsh에서 두 개의 정수(예: 2~57)로 파일 범위(사전순)를 지정하고 싶습니다.

예: "특정 와일드카드 패턴과 일치하는 경로 아래에서 사전순으로 파일 2~57을 선택합니다."

대괄호를 사용하면 효과가 있을 것 같아요

 for x in /foo/bar/*[2-57]; do print $x; done

그러나 zsh 는 분명히 2내가 . 어떤 아이디어가 있나요? 어떻게 해야 하나요?5257

답변1

[2-57]23, , 4, 5및 zsh 의 7기타 모든 와일드카드 및 정규식 구문 으로 구성된 문자 세트입니다. 전역 패턴은 *[2-57]마지막 문자가 이 5개 숫자 중 하나인 모든 파일 이름과 일치합니다.

구문을 잘못 기억하신 것 같아요[m,n] 글로벌 예선. 전역 한정자는 항상 패턴 끝의 괄호 안에 배치되며 범위 구분 기호는 쉼표입니다. 모드는 *([2,57])2차, 3차,…, 57차전까지 확장된다. 기본 확장 순서는 사전식 순서입니다( numeric_glob_sort이 옵션이 설정된 경우 일부 특수 마법을 사용하여 숫자를 숫자로 정렬합니다). o또는 Oglob 한정자를 사용하여 이를 제어할 수 있습니다(예: *(om[2,57])57개 최신 파일 중 첫 번째 최신 파일이 아닌 파일 일치). .

for x in /foo/bar/*([2,57]); do print $x; done

요청한 내용은 아니지만 향후 독자에게 관련이 있으며 유용할 수 있습니다. 존재 여부에 관계없이 파일 2~57을 열거하려면 다음 범위를 사용할 수 있습니다.중괄호 표현. 이 기능은 bash 및 ksh에도 존재합니다.

echo hello{2..57}

이름에 2에서 57 사이의 숫자가 포함된 파일을 일치시키려면 패턴을 사용할 수 있습니다 <2-57>. 이는 zsh에만 해당됩니다.

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

숫자도 일치할 수 있으므로 유사한 패턴이 *<2-57>예상한 대로 작동하지 않을 수 있습니다 . *예를 들어 file58match *<2-57>, file5match *part 및 8match <2-57>part가 있습니다. 이 모드는 *[^0-9]<2-57>이 문제를 방지합니다.

답변2

그러나 zsh는 분명히 내가 파일 2~57 대신 파일 2~5(또는 이와 유사한 것)를 요구한다고 생각합니다. 어떤 아이디어가 있나요?

[]대괄호는 일치 항목 목록을 나타내기 때문에수치(숫자일 수 있음) 대신숫자수학적으로 설명해보세요. 이 모델은 다음과 관련이 있습니다.하나의특징. 목록에는 범위가 포함될 수 있지만 숫자나 문자도 포함될 수 있습니다. [2-57]경기는 다음으로 확대됩니다."2~5 범위의 모든 숫자그리고7인치..

2에서 57 사이의 숫자를 일치시키려면 다음을 사용하십시오.서열 표현와일드카드 패턴 대신(또는 이와 같은 패턴과 함께):

for x in /foo/bar/*{2..57}; do print $x; done

편집하다: 그러나 불행하게도 이것은 나열된 모든 파일의 사전식 순서를 제공하지 않습니다. 쉘 확장으로 인해 공통 숫자 끝으로 그룹화됩니다.

관련 정보