rm * (1) *가 디렉토리의 모든 파일을 제거하는 이유는 무엇입니까?


47

나는 기대했다 :

$ rm *(1)*

(1)이름에 포함 된 모든 파일을 제거합니다 . 내가 틀렸어. 디렉토리의 모든 파일을 제거했습니다.

왜?


5
rm패턴과 함께 사용할 때마다 echo실제 명령을 실행하기 전에 항상 패턴 앞에옵니다 . 습관은 (차이 혼란, 6 세 정도로, 그 이후로 한 번 이상 나를 구원 DEL A: *.*DEL *.* A:).
gerrit

답변:


51

보낸 사람 man bash:

*(pattern-list)
                 Matches zero or more occurrences of the given patterns

0 이상으로 시작하는 1파일 (모든 파일) 과 일치하는 glob 표현식이 있습니다.

이 globbing 동작을 비활성화하는 간단한 방법 중 하나 \는 괄호 를 피하는 것입니다.

rm *\(1\)*

그렇지 않으면 shopt -u extglob동작을 비활성화하고 shopt -s extglob다시 활성화하는 데 사용할 수 있습니다.

shopt -u extglob
rm *(1)*
shopt -s extglob

로합니다 스테판 말한다 , extglob으로 활성화되어 bash-completion있으므로 정상적으로 작동하지 완성 기능을 발생할 수 비활성화.


7
그 참고 extglob기본적으로이 아니라 설치 및 사용할 수 있음을 경우 bash_completion으로 설정되어 있습니다. bash같은 옵션에 대한 로컬 범위가 없습니다 zsh.
Stéphane Chazelas

1
또한 bash-4.3회귀가 있으므로 *(1)*숨겨진 파일도 확장됩니다.
Stéphane Chazelas

@StephaneChazelas 해당 회귀와 관련된 버그에 대한 링크가 있습니까? 감사
기본

2
@Basic, 간다 . Chet 님은 아직 답변하지 않았습니다.
Stéphane Chazelas

9

이것은 아마도 extglob쉘 옵션 과 관련이 있습니다. 끄면 패턴이 오류 메시지를 생성합니다.

martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob         off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('

내가 켜면 실제로 모든 것과 일치하는 것 같습니다. 맨 페이지는 이러한 패턴을 문서화하며 관련이 있다고 생각합니다.

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

선행 문자가없는 괄호가 무엇인지 지정하는 문서는 없습니다. 어쨌든 다음과 같이 괄호를 인용하여 문제를 피할 수 있습니다.

martin@dogmeat ~ % echo *\(1\)*
A(1)b

또한, 사용 echo또는 ls해당 작업의 절대적으로 확실하지 않은 첫 번째 경우 패턴을 테스트 :)


참고 {로 괄호, (괄호 (또는 둥근 괄호)입니다.
Mikel

아 고마워 나는 영어를 모국어로 사용하지 않으므로 혼동하는 경향이 있습니다 :)
Martin von Wittich

6
영국식 : {= 중괄호, (= 둥근 괄호, [= 대괄호. 미국의 경우 : {= 중괄호, (= paren, [= 대괄호 약간 혼란 스럽다. 무엇을했는지 확인해야 할 경우 Jargon File-ASCII 가 매우 유용합니다.
Mikel

4
@Mikel 감사합니다, 나는 또한 여기에서 확인 했으므로 이제 꽃 괄호다람쥐 에 대해 알 수 있습니다!

인도 영어에서는 {꽃 괄호, [대괄호, (둥근 괄호 또는 일반적으로 괄호입니다. :-)
ShreevatsaR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.