"rm *"을 실행할 때 "No match found"를 제거하는 방법


22

를 사용하면 zsh맞지 않는 패턴을 선택하거나 rm출력을 리디렉션 할 때도 "No match found"메시지가 나타납니다 .

# rm * > /dev/zero 2>&1
  zsh: no matches found: *

이 메시지를 어떻게 제거 할 수 있습니까?


현재 디렉토리의 모든 것을 삭제하려고합니까? 현재 디렉토리는 무엇입니까?
cutrightjm

당신은 사용할 수 있습니다 setopt extended_glob(또는 일반 rm * >/dev/null 2>&1)하지만 정말 당신이 필요가 없습니다에 해결 방법을 확인해야합니다 rm *, 그것은 명백한 위험
grochmal

당신은 /dev/null오히려 오히려 오히려 침몰해야합니다 dev/zero. 또한 stderr 리디렉션에 &; 이 없습니다 . 이어야합니다 2>&1.
roaima

오류 메시지는 zsh명령 자체의 런타임 중에가 아니라 명령을 평가 하는 동안 생성됩니다 (오류로 인해 명령이 실행되지 않음). 여기서 출력 경로 재 지정은 쉘 자체가 아닌 명령 출력에만 영향을줍니다.
Adaephon

답변:


42

이 동작은 Zsh의 nomatch옵션으로 제어됩니다 . 기본적으로 명령 줄에 일치하지 않는 globbing 표현식이 포함되어 있으면 Zsh는보고있는 오류 메시지를 인쇄하고 명령을 전혀 실행하지 않습니다. 당신은 이것을 실행하여 이것을 비활성화 할 수 있습니다

setopt +o nomatch

그런 다음, 아무것도 일치하지 않는 글 로빙 표정이 그대로 남아있을 것입니다, 당신은에서 오류 메시지가 얻을 것이다 rm당신이 사용하지 않도록 설정할 수 있습니다 ( -f그게 다른 상황에서 제거를 강제하기 때문에 좋은 생각이야 있지만, 어디 수도 있지 고 싶어요).


4
또한 동작은 nullglobcshnullglob옵션으로 제어됩니다 . 경우 nullglob설정과 일치하는 파일이 발견되지 않는, 패턴 대신 오류를 generationg의 인수 목록에서 제거됩니다. cshnullglob명령의 모든 패턴이 일치하지 않는 한 설정 은 유사한 영향을 미치며이 경우 오류가보고됩니다. 참고 : 설정 nullglob또는 cshnullglob무시 nomatch. 또한 설정할 수 있습니다 nullglob글로브 한정자를 사용하여 하나의 패턴 N: rm *(N).
Adaephon

nomatch이상적이지 않습니다. 그것은 Bourne과 같은 껍질입니다. 패턴이 일치하지 않으면 rm(!) 로 그대로 전달되어 rm오류가 발생하거나 예 *.[ch]를 들어 패턴과 같은 패턴에 대한 잘못된 파일을 삭제할 수 있습니다 !
Stéphane Chazelas

9

대신 무엇을 원하십니까? 전혀 달리지 rm않습니까 (1)? *다른 Bourne과 같은 쉘 (2)과 같은 리터럴 인수로 실행 합니까? 전혀 논쟁없이 그것을 실행 (3)?

  1. files=(*(N)); (($#files)) && rm -- $files. 또는 (rm -- *) 2> /dev/null그것은 또한 rm어리석은 진정한 오류를 숨길 것입니다. zsh오류를 무시할 수는 있지만 rm명령을 위해 stderr을 복원하십시오.(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
  2. emulate sh -c 'rm -- *' 2> /dev/null. 에서와 같은 그런 sh어떤 zsh이제 단일 명령 줄을 에뮬레이트, 비 매칭 *에 그대로 전달 rm하고 rm그 같은 불평 *파일이 존재하지 않습니다. 우리는 억제 rm당신이 할 것 같은의 표준 에러를 sh억제하는 오류 메시지, 그러나 다시, 그것은으로 정품 오류 숨길 것 같은 바보가 rm의 잘못된 행동에 의해 발생하는 오류에 반대 sh리터럴을 전달 *하는 방법에 대해 rm. rm -f '*'존재하지 않는 *파일 에 대해 불평 하지 않으므로 할 수 있습니다.emulate sh -c 'rm -f -- *'
  3. rm -- *(N). rm하지만 다시, 어떤 인수를 전달하지 않을 때는 아니지만 불평 것 rm -f: rm -f -- *(N).

일반적으로, rm -f모든 파일을 삭제하고 파일을 제거 할 수 없거나 IOW가 여전히 rm리턴 된 후에 만 오류가 발생하는 경우 사용하려는 명령 입니다. 또한 일반적으로 -f일부 상황에서 사용자에게 프롬프트가 표시되지 않도록 스크립트에 사용하려고합니다.

여기서 rmglob이 일치하지 않을 때 호출하는 것이 잘못되었습니다. sh 행동은 잘못된 것입니다. 같은 패턴의 경우 무해 *하지만 같은 패턴의 경우 일치하지 않으면 그대로 *.[ch]전달 *.[ch]하면 *.[ch]파일이 실수로 제거 될 수 있습니다 .

$ ls
*.[ch]  foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch]  foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt

오류와 함께 실패하는 것은 할 수있는 가장 현명한 일이며, 무엇을 zsh(그리고 fish, csh, tcsh, bash -o failglob원래 유닉스 쉘)한다.

그리고 특별한 경우를 스스로 돌보고 싶다면 위의 (1)과 같이 glob 한정자 ( noglob )를 zsh사용하여 쉽게 만드십시오 . (적어도 최신 버전에서는 ) 명령에 대한 암시 적 noglob 를 수행하는 것처럼 훨씬 쉽습니다 . 따라서 이에 상응하는 내용은 다음과 같습니다.(N)fishset

set files *
if count $files > /dev/null
  rm -f -- $files
end

자세한 내용 은 nullglob가 기본값이 아닌 이유 를 참조하십시오.


1 . 엄밀히 말하면 그것은 shBourne 쉘 (1979 년 Unix V7 이후) 이후입니다. 이전 버전 sh(전화를했다 /etc/glob곳이다 인용 부호로 둘러싸이지 않은 와일드 카드에 글로브의 이름에서 유래가)처럼 행동했다 csh또는 zsh -o cshnullglob이다가, /etc/globglobs와의 아무도 어떤 경기가 없었다 경우 명령을 취소 것 (적어도 경우 일치하지 않는 globs와 억제 것 그들 중 하나가 일치했습니다). Bourne 쉘 이 동작을 중단 했습니다.


그는 rm쉘이 아닌 오류 메시지를 얻을 것으로 예상합니다 . "rm :`* '을 제거 할 수 없습니다 : 그런 파일이나 디렉토리가 없습니다"와 같은 것.
Emmanuel

@ Emmanuel, 그러면 2 : emulate sh -c 'rm -- *'Bourne 쉘의 (버기 IMO) 동작을 얻는 것입니다.
Stéphane Chazelas

@Stephane_Chazelas는 작성되었지만 2는 그가 묻지 않은 질문에 대한 정답입니다 :).
Emmanuel

@Emmanuel, 3 명 모두 질문에 답합니다 : "일치하지 않음"오류를 제거하는 방법. OP의 코드는 rm오류를 억제합니다 . 일치하는 파일이 없을 때 오류를 억제하기 위해 다른 쉘에서 수행하는 작업이며 실제 rm 오류도 억제합니다. 내 대답은 그것을 요약하고 zsh 동작이 선호되는 방식을 보여줍니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.