私はそれを期待しました:
$ rm *(1)*
(1)名前に含まれるすべてのファイルを削除します。私は間違っていた。ディレクトリ内のすべてのファイルを削除しました。
どうして?
私はそれを期待しました:
$ rm *(1)*
(1)名前に含まれるすべてのファイルを削除します。私は間違っていた。ディレクトリ内のすべてのファイルを削除しました。
どうして?
回答:
から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ので、それが正常に動作しない補完機能を引き起こす可能性が無効。
extglobデフォルトでオンではありませんが、あなたがインストールされ、有効になっていることがあればbash_completionでオンになっています。bashのようなオプションのローカルスコープはありzshません。
bash-4.3、リグレッションに*(1)*は隠しファイルも展開されることに注意してください。
これはおそらく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あなたは絶対にわからさんが働いていることはありません場合は、最初のあなたのパターンをテストするために:)
{括弧、括弧((または丸括弧)です。
{=中括弧、(=丸括弧、[=角括弧。アメリカ語:{=括弧(、[=括弧、=括弧。少しわかりにくい。何が呼ばれているのかを確認する必要がある場合、Jargon File-ASCIIは非常に役立ちます。
{は、花括弧、[角括弧、(丸括弧、またはより一般的な単なる括弧です。:-)
rmパターンを使用するときは常にecho、実際のコマンドを発行する前に常にパターンの前に置きます。習慣は(違い混乱、6歳かそこらとして、それ以来回以上私を救ったDEL A: *.*としますDEL *.* A:)。