와일드카드에 대한 응답 문자 변경( '**' )

와일드카드에 대한 응답 문자 변경( '**' )

와일드카드 연산자를 실행했습니다.

**

디렉토리 목록에서

ls -d "$PWD/"**/

하지만 Enter 키를 누르고...기다리고...기다리고...수천 개의 행을 생성한 후 즉시 답변을 다시 토해내는 것을 발견했습니다.

출력이 한 번에 하나의 전역 변수 대신 한 번에 한 줄씩 생성되도록 할 수 있습니까? 이것이 전역 설정인지, OS 설정인지, 아니면 프로필 설정인지 궁금합니다.

(흥미롭게도 이 질문은 외부 디스플레이(컴퓨터 모니터)와 컴퓨터 내부 처리 사이의 경계를 넘나듭니다.

이 질문은 내 위치를 바꾸는 것으로 생각될 수 있습니다.관찰자모니터 밖부터 컴퓨터 작업 공간 안 어딘가까지 내가 갈 수 없는 곳, 나의관찰자갈 수는 없지만 역설적으로할 수 있는가서 그냥 거기로 가려면... 비물질 공간에 있기 때문에 우리는 그 공간이나 그 공간의 겉보기 동작을 결코 확신할 수 없습니다.

저는 이러한 다른 쉘을 사용하여 컴퓨터 기능의 이러한 공간 내부를 볼 수 있게 해주는 다른 쉘이 있는지에 대해 다른 공간에서 또 다른 질문을 할 것입니다. 그러나 그것은 범위를 벗어나기 때문에 여기서는 더 자세히 다루지 않겠습니다. 이 질문 범위의. )

답변1

파일 이름 생성이라고도 알려진 glob 의 요점은 패턴과 일치하는 파일 경로의 (정렬된) 목록을 생성한 다음 명령에 전달하는 것입니다.

물론 목록은 명령에 전달되기 전에 작성되어야 합니다. 왜냐하면 목록 전체가 시스템 호출에 대한 인수로 전달되기 때문입니다 execve().

명령 인수에 glob을 전달할 필요가 없으며 다음과 같이 결과를 배열에 할당할 수도 있습니다.

files=( **/*.txt )

또는 루프에서 사용하십시오 for.

for file in **/*.txt; do...

그러나 이번에도 목록이 먼저 구성되고 정렬된 다음 처리됩니다.

파일만 인쇄하려면 glob 한정자의 일부로 **/쉘과 함께 zsh 쉘(원래 1992년) 을 사용할 수 있습니다. print좋다:

**/*(N^e['print -r -- $REPLY'])

+funcname또는 대신 도우미 함수와 한정자를 사용하세요 e[code].

p() { print -r -- $REPLY; false; }

그 다음에:

**/*(N+p)

또는 이후 set -o globstarshort:

**(N+p)

또는:

**(/N+p)

파일 형식의 경우목차오직.

목록은 정렬되지 않습니다.

물론 ls -ld --대신 사용할 수는 있지만 내장되어 print -r --있지만 그렇지 않으며 각 파일에 대해 새 프로세스에서 별도로 실행하는 데 비용이 많이 듭니다.printlsls

파일에서 더 많은 정보를 얻으려면 zsh의 stat내장 기능을 사용하는 것이 좋습니다( zmodload zsh/stat먼저 로드).


1 여기서는 glob 한정자가 사용됩니다 /. 이렇게 하면 모든 디렉토리에 **/추가된 디렉토리에 대한 심볼릭 링크도 얻게 됩니다 ./

답변2

이것은 와일드카드 find가 아닌 직업처럼 들립니다 .ls

find "${PWD}" -type d

기술적/철학적 뒷부분은 다루지 않겠습니다.

관련 정보