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


24

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

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

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

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

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

답변:


30

[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>은이 문제를 피합니다.


네 말이 맞아 글로브 한정자를 잘못 기억하고있었습니다. 신중하게 설명해 주셔서 감사합니다.
Amelio Vazquez-Reina

그건 그렇고,이 진술은 나를 약간 혼란스럽게했습니다 if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression. 파일이 존재하지 않고 일치하는 항목이없는 경우 중괄호 확장은 확장 방법을 어떻게 알 수 있습니까? (어떻게는 글로브 규정 다르게 확장 것인가?)
아멜리오 바스케스 - 레이나에게

2
@intrpc가로 foo{8..11}bar확장됩니다 foo8bar foo9bar foo10bar foo11bar. 이 확장 비트는 파일 이름과 관련이 없습니다. 마찬가지로으로 foo{eight,nine,ten,eleven}bar확장됩니다 fooeightbar fooninebar footenbar fooelevenbar. 이것은 ksh / bash / zsh에서 중괄호 확장 입니다.
Gilles 'SO- 악마 그만해

6

그러나 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

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


감사합니다 @rozcietrzewiacz! 나는 그것에 대해 생각 했어야했다. 내 파일에는 내가 생각 잠시, 그들에 숫자를했다 [].. 위해 일을 인쇄했다
아멜리오 바스케스 - 레이나에게

당신의 설명 [2-57]은 정확하지만, 나는 {2..57}그것이 intrpc가하고 싶은 것과 관련 이 없다고 생각하지 않습니다 .
Gilles 'SO- 악마 그만해

편집 해 주셔서 감사합니다 (잠자기 시간). 그리고 당신 말이 맞아요- 사전 편찬 순서 부분을 잊어 버렸습니다 .
rozcietrzewiacz 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.