중괄호 확장을 사용하여 zsh의 파일 일치

중괄호 확장을 사용하여 zsh의 파일 일치

bash중괄호를 사용하여 여러 파일의 패턴을 일치시킬 수 있습니다 .

ls *.{dot,svg,err}

특정 확장자를 가진 파일이 없으면 경고가 표시되지만 나머지 파일은 나열됩니다.

ls: '*.err'에 액세스할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

하지만, zsh대신 오류가 발생합니다.출력 없음기존 파일에 대해 생성됩니다.

zsh: 일치하는 항목을 찾을 수 없습니다: *.err

삭제 시에도 작동합니다. 다음을 사용하여 파일을 삭제해 보세요.

rm -f *.{dot,svg,err}

bash일치하는 모든 파일은 오류나 경고 없이 삭제되지만 , zsh오류가 발생하고 아무것도 삭제되지 않습니다.

zsh동작을 this 와 동일하게 만드는 방법이 있습니까 bash, 아니면 기존 파일을 쉽게 삭제/나열하는 다른 방법이 있습니까?


분명히 비슷한 일을 할 수 있지만 find . -name '*.dot' -or -name '*.svg' -or -name '.err' | xargs rm특별히 쉽고/실용적이지는 않습니다.

답변1

당신은 얻지 못한다경고bash, 당신은실수by ls( ls종료 상태가 0이 아니므로 실패했음을 나타냄)

zsh및 에서는 와일드카드 bash{...}아니며 와일드카드 이전에 발생하는 확장입니다.

존재하다:

ls -d -- *.{dot,svg,err}

(잊었 -d지만 --) 쉘은 첫 번째 {...}것을 확장합니다.

ls -d -- *.dot *.svg *.err

그런 다음 glob을 실행하십시오. bash대부분의 Bourne형 쉘과 마찬가지로, 일치하지 않는 글로브가 변경되지 않고 전달된다는 결함이 있습니다. on 인 경우 zsh일치하지 않는 글로브는 오류입니다.

nor라는 이름의 파일이 없는 경우 파일을 삭제하는 rm -f [ab].c방법을 확인하세요. bash에서 당신은[ab].ca.cb.czsh불일치대신 오류가 발생했습니다. 유사한 동작에 대해서는 failglob의 옵션을 참조하세요 .bash

ls -d -- *.{dot,svg,err}(N)

in은 zsh3개의 모든 glob에 대해 옵션을 활성화하므로 nullglobglob이 일치하지 않으면 제거되지만 glob 중 어떤 파일도 일치하지 않으면 명령은 다음과 같으므로 원하는 것이 아닐 수도 있습니다.

ls -d --

.(현재 디렉토리) 가 나열됩니다 .

여기서 사용하는 것이 가장 좋습니다하나glob은 3가지 확장자 중 하나를 가진 파일과 일치합니다.

ls -d -- *.(dot|svg|err)

패턴과 일치하는 파일이 발견되지 않는 한 실행될 정렬 ls된 파일 목록이 제공됩니다 .ls

선택적으로 또는 sh/ bash(가짜 IMO) 동작을 활성화하는 데 사용할 수도 있습니다. 약간 더 나은 접근 방식은 이 동작을 활성화하는 것입니다(이는 Bourne 쉘이 출시되기 전 Unix 쉘의 동작이기도 했습니다).emulate shunsetopt nomatchcsh

setopt cshnullglob

이 옵션을 사용하면 다음과 같은 경우에만 명령이 취소됩니다.모두명령줄의 glob은 일치할 수 없습니다. 일치하는 항목이 하나 이상 있는 경우 일치하지 않는 항목은 모두 제거되므로 다음과 같습니다.

ls -d -- *.{dot,svg,err}

확장되고 dot누락 된 항목 svgerr차례로 생략됩니다.

인수 순서에 대한 다양한 메서드의 효과를 비교하려면 해당 ls메서드를 표시하기 전에 정렬하지 않는(반대로) 명령이 필요합니다. GNU를 사용하면 ls해당 옵션을 전달할 수 있습니다 -U. 또는 ls인수가 여기에만 인쇄되므로 printf '%s\n' *....

답변2

패턴 이 수정되었습니다 (N). 이는 일치 항목 누락으로 인해 zsh가 화를 내지 않도록 지시합니다.

rm -f *.{dot,svg,err}(N)

이것은 zsh전역 기능입니다. man zshexpn자세한 내용은 "글로벌 한정자"를 참조하세요. "현재 모드에 대해 NULL_GLOB 옵션을 설정하십시오"라고 설명되어 있습니다.

관련 정보