zsh에서 사전 순으로 여러 자릿수 범위의 파일 아래에서 사전 순서대로 파일

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

예를 들면 : “글로브 패턴과 일치하는 경로 아래에서 사전 순서대로 파일 2에서 57을 선택하십시오”.

대괄호를 사용하면 그렇게 될 것이라고 생각했습니다.

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

그러나 zsh는 분명히 파일 대신 파일 2을 요구한다고 생각 합니다 . 왜 생각해? 어떻게하면됩니까?5257



답변

[2-57]구성된 문자 세트는 2, 3, 4, 57, 다른 모든 zsh을 와일드 카드 및 정규 표현식 구문 거기. 글로브 패턴 *[2-57]은 마지막 문자가 5 자리 중 하나 인 모든 파일 이름과 일치합니다.

[m,n] glob 한정자 의 구문을 잘못 기억하고 있다고 생각합니다 . 전역 한정자는 항상 패턴 끝에서 괄호 안에 들어가며 범위 구분 기호는 쉼표입니다. 패턴 *([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>*숫자와도 일치 할 수 있기 때문에 예상 한대로 수행하지 않을 수 있습니다. 예를 들어, file58일치 *<2-57>하여, file5일치하는 *부분과 8일치하는 <2-57>부분. 패턴 *[^0-9]<2-57>은이 문제를 피합니다.


답변

그러나 zsh는 분명히 파일 2 ~ 57 대신 파일 2 ~ 5 (또는 이와 유사한 것)를 요구한다고 생각합니다. 왜 그런 생각이 있습니까?

때문에 []괄호 일치의 목록이 표시 문자 (숫자가 될 수있는),하지 수는 수학적으로 해석했다. 이러한 패턴은 단일 문자 와 일치 합니다. 목록에는 범위가 포함될 수 있지만 숫자 나 문자가 포함될 수 있습니다. [2-57]match는 “2에서 5 7 사이의 모든 숫자”로 확장됩니다 .

2에서 57까지의 숫자를 일치 시키려면 globbing 패턴 대신 (또는 이와 함께) 시퀀스 표현식 을 사용하는 것이 더 쉽습니다 .

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

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