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

나는 기대했다 :

$ rm *(1)*

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

왜?



답변

보낸 사람 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있으므로 정상적으로 작동하지 완성 기능을 발생할 수 비활성화.


답변

이것은 아마도 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해당 작업의 절대적으로 확실하지 않은 첫 번째 경우 패턴을 테스트 🙂