rm *(1)*がディレクトリ内のすべてのファイルを削除するのはなぜですか?


47

私はそれを期待しました:

$ rm *(1)*

(1)名前に含まれるすべてのファイルを削除します。私は間違っていた。ディレクトリ内のすべてのファイルを削除しました。

どうして?


5
rmパターンを使用するときは常にecho、実際のコマンドを発行する前に常にパターンの前に置きます。習慣は(違い混乱、6歳かそこらとして、それ以来回以上私を救ったDEL A: *.*としますDEL *.* A:)。
ゲリット14年

回答:


51

からman bash

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

1すべてのファイルである0個以上のsで始まるファイルに一致するglob式があります。

このグロビング動作を無効にする簡単な方法の1つは\、括弧をエスケープすることです。

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ません。
ステファンシャゼル14年

1
またbash-4.3、リグレッションに*(1)*は隠しファイルも展開されることに注意してください。
ステファンシャゼル14年

@StephaneChazelasその回帰に関連するバグへのリンクはありますか?ありがとう
基本的な14年

2
@Basic、ここに行きます。チェットはまだ返信していません。
ステファンシャゼル14年

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あなたは絶対にわからさんが働いていることはありません場合は、最初のあなたのパターンをテストするために:)


参考:中{括弧、括弧((または丸括弧)です。
ミケル14年

ああ、ありがとう。私はそれらを混同する傾向があるので、私は英語のネイティブスピーカーではないよ:)
マーティン・フォン・Wittich

6
英国では:{=中括弧、(=丸括弧、[=角括弧。アメリカ語:{=括弧([=括弧、=括弧。少しわかりにくい。何が呼ばれているのかを確認する必要がある場合、Jargon File-ASCIIは非常に役立ちます。
ミケル14年

4
@Mikelありがとう、私もここでチェックしので、今では花のブラケットリスのブラケットについて知っています!

インド英語で{は、花括弧、[角括弧、(丸括弧、またはより一般的な単なる括弧です。:-)
シュリーヴァツァー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.