![-bash:!:未找到事件](https://linux22.com/image/884361/-bash%EF%BC%9A%EF%BC%81%EF%BC%9A%E6%9C%AA%E6%89%BE%E5%88%B0%E4%BA%8B%E4%BB%B6.png)
我想删除除名为 docs 的文件夹之外的所有文件夹和文件。
echo !(docs)
但我得到了-bash: !: event not found
?
我正在使用 Mac 默认终端。
答案1
您有两个问题:
!(doc)
是一个扩展的 glob并且extglob
已关闭。如果您的 bash 支持extglob
,您可以使用以下命令将其打开:shopt -s extglob
历史扩展已打开。要关闭它,请运行
set -H
使用历史扩展时,可能会发生意外情况
!
。如果您不使用历史扩展,可以将其关闭,以避免意外情况。
例子
让我们考虑包含这些文件的目录:
$ ls
docs file1 file2
现在让我们打开 extglob离开和历史在并运行命令:
$ shopt -u extglob; set -H
$ echo !(docs)
bash: !: event not found
这正是您报告的错误消息。因此,这似乎是您的情况。
现在,让我们保留 extglob离开并转向历史扩展离开:
$ shopt -u extglob; set +H
$ echo !(docs)
bash: syntax error near unexpected token `('
此错误与您报告的错误不同。这不是您的情况。
最后,让我们用 extglob 运行你的命令在为了完整起见,我们将在两种设置中尝试历史扩展:
$ shopt -s extglob; set +H
$ echo !(docs)
file1 file2
$ shopt -s extglob; set -H
$ echo !(docs)
file1 file2
这两种方法都可以。因此,只要您的 shell 支持 extglob 并且已将其打开,您的命令就应该可以工作。