나는 이것이 쉘에서 제공하는 방법이 아니라는 것을 거의 확신 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]))'])
. 또는 등의 다른 구분 기호와 함께 작동하지 않습니다 .]
[...]
:...:
{...}