![중괄호 확장을 사용하여 zsh의 파일 일치](https://linux55.com/image/91277/%EC%A4%91%EA%B4%84%ED%98%B8%20%ED%99%95%EC%9E%A5%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20zsh%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%BC%EC%B9%98.png)
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].c
a.c
b.c
zsh
불일치대신 오류가 발생했습니다. 유사한 동작에 대해서는 failglob
의 옵션을 참조하세요 .bash
ls -d -- *.{dot,svg,err}(N)
in은 zsh
3개의 모든 glob에 대해 옵션을 활성화하므로 nullglob
glob이 일치하지 않으면 제거되지만 glob 중 어떤 파일도 일치하지 않으면 명령은 다음과 같으므로 원하는 것이 아닐 수도 있습니다.
ls -d --
.
(현재 디렉토리) 가 나열됩니다 .
여기서 사용하는 것이 가장 좋습니다하나glob은 3가지 확장자 중 하나를 가진 파일과 일치합니다.
ls -d -- *.(dot|svg|err)
패턴과 일치하는 파일이 발견되지 않는 한 실행될 정렬 ls
된 파일 목록이 제공됩니다 .ls
선택적으로 또는 sh
/ bash
(가짜 IMO) 동작을 활성화하는 데 사용할 수도 있습니다. 약간 더 나은 접근 방식은 이 동작을 활성화하는 것입니다(이는 Bourne 쉘이 출시되기 전 Unix 쉘의 동작이기도 했습니다).emulate sh
unsetopt nomatch
csh
setopt cshnullglob
이 옵션을 사용하면 다음과 같은 경우에만 명령이 취소됩니다.모두명령줄의 glob은 일치할 수 없습니다. 일치하는 항목이 하나 이상 있는 경우 일치하지 않는 항목은 모두 제거되므로 다음과 같습니다.
ls -d -- *.{dot,svg,err}
확장되고 dot
누락 된 항목 svg
은 err
차례로 생략됩니다.
인수 순서에 대한 다양한 메서드의 효과를 비교하려면 해당 ls
메서드를 표시하기 전에 정렬하지 않는(반대로) 명령이 필요합니다. GNU를 사용하면 ls
해당 옵션을 전달할 수 있습니다 -U
. 또는 ls
인수가 여기에만 인쇄되므로 printf '%s\n' *...
.
답변2
패턴 이 수정되었습니다 (N)
. 이는 일치 항목 누락으로 인해 zsh가 화를 내지 않도록 지시합니다.
rm -f *.{dot,svg,err}(N)
이것은 zsh
전역 기능입니다. man zshexpn
자세한 내용은 "글로벌 한정자"를 참조하세요. "현재 모드에 대해 NULL_GLOB 옵션을 설정하십시오"라고 설명되어 있습니다.