zsh에서 glob 한정자의 범위를 제한합니다.

zsh에서 glob 한정자의 범위를 제한합니다.

나는 이것이 쉘에서 제공하는 방법이 아니라는 것을 거의 확신 zsh하지만 어쨌든 매뉴얼에 빠진 것이 없는지 확인하기 위해 물어볼 것이라고 생각했습니다.

셸을 사용하면 zsh다음 패턴을 사용하여 디렉터리에서 표시되는 가장 큰 파일 두 개를 선택할 수 있습니다.

*(.OL[1,2])

일련의 디렉토리가 있고 각 디렉토리에 두 개의 가장 큰 파일이 필요하다면 개별 디렉토리를 반복한 다음 다음을 사용해야 한다고 생각합니다.

$dirpath/*(.OL[1,2])

( $dirpath현재 루프 반복에서 디렉터리 경로는 어디에 있습니까?)

이것은 ~이 될 것이다좋아요말할 수 있다

*/*(.OL[1,2])

그러나 glob 한정자는 일치하는 이름의 전체 목록에 적용되며 각 디렉터리에서 두 개가 아닌 두 개의 일치 항목을 얻습니다.

질문: 가장 가까운 경로 구성 요소에만 영향을 미치도록 한정자의 "범위"를 제한할 수 있습니까?

답변1

루프가 필요하지 않습니다. 중간 변수이면 충분합니다. 사용^매개변수 확장 각인어레이에 분산됩니다.

dirpath=(*(N-/))
print -rC1 -- $^dirpath/*(.NOL[1,2])

또는 임시 변수를 피하기 위해 익명 함수를 사용할 수 있습니다( $argv/ $@익명 함수 매개변수가 됩니다).

() {print -rC1 -- $^@/*(.NOL[1,2])} *(N-/)

답변2

또 다른 접근 방식은 다음과 같습니다.

print -rC1 -- *(N-/e['reply=($REPLY/*(N.OL[1,2]))'])

파일 목록을 추가로 반환하기 위해 xpression glob 한정자 $reply에 배열을 설정할 수 있습니다. e따라서 여기서는 디렉터리 또는 심볼릭 링크 목록을 전역화하고 각 디렉터리에 대해 가장 큰 2개의 일반 파일을 반환합니다.

e한정자 구문은 구분 기호 이외의 문자나 ,와 같은 쌍을 e:code:사용할 수 있는 입니다 (사용할 수도 있지만 , , , 도 따옴표 로 묶어야 함). 그러나 단어 확장은 실제로 glob 한정자의 어느 곳에서나 섹션에서 수행됩니다. 예를 들어 그 안에 변수를 사용할 수 있기 때문에 괜찮습니다 . 그러나 이것이 의미하는 바는 일반적으로 내부 작은따옴표를 넣어야 한다는 것입니다. ~에:e{code}e[code]e(code)e<code>()<>code*(L+$min_size)code예방하다확대.

이제 (그리고최근에 배운 비법이에요:?) 대신 와일드카드( , 쌍 *도 포함 [) 인 문자를 ]구분 기호로 사용하고 구분 기호를 따옴표 밖에 두는 경우 해당 문자가 왜냐하면 따옴표가 없는 *구분 기호는 따옴표가 없는 다른 구분 기호와만 일치할 수 있기 때문 *입니다 .[]

따라서 unquoted 로 구분된 (인용) 코드에서 발생하더라도 유효합니다 *(N-/e['reply=($REPLY/*(N.OL[1,2]))']). 또는 등의 다른 구분 기호와 함께 작동하지 않습니다 .][...]:...:{...}

관련 정보