为什么我会收到“意外标记‘(’附近的语法错误”?

Dan*_*cio 5 unix bash

我想遍历许多目录并删除所有文件,除了一些满足特定条件的文件。我有以下 bash 脚本:

#!/bin/bash
for i in */
do
  cd $i
  rm !(*M.*)
  cd ..
done
Run Code Online (Sandbox Code Playgroud)

但是,当我运行脚本时,出现以下错误:

script1.sh: line 5: syntax error near unexpected token `('
script1.sh: line 5: `    rm !(*M.*)'
Run Code Online (Sandbox Code Playgroud)

可能出什么问题了?我使用的是 Ubuntu 14.04。

感谢您的帮助。

小智 6

我认为你应该启用extglob使用反转或负通配符:

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

请注意,您可以一直保持此状态,这没有害处。

也就是说,您不必在代码中使用循环,可以直接放入脚本中:

rm */!(*M.*)
Run Code Online (Sandbox Code Playgroud)

您可以访问此帖子以获取其他解决方案: https://unix.stackexchange.com/questions/78376/in-linux-how-to-delete-all-files- except-the-pattern-txt