我已经到处找过了,但我找不到!
Ubuntu 中的意思,我到处都看到它。例如:
find -f -d !(.txt)
答案1
从:https://unix.stackexchange.com/a/3748
!
是最初出现在 C shell 中的一项功能,那时您还无法依靠终端使用箭头键。如果您将当前命令编号添加到提示符 (PS1="\!$ "
),那么此功能特别有用,这样您就可以快速查看屏幕以获取过去命令的编号。现在您可以使用箭头键和诸如Ctrl-R搜索命令历史记录之类的功能,但我认为该功能没什么用处。
您可能仍然会发现它的一种有用的变体是
!!
,它会重新执行上一个命令。就其本身而言,我发现没有 !!Enter比 更快的了 ↑ Enter,但当将其组合成一个更大的命令时,它会很有用。例子:普通的飞行员失误在
sudo
基于系统的缺点是忘记sudo
需要额外权限的命令的前缀。新手会重新输入整个命令。勤奋的学生会从 shell 的命令历史记录中编辑命令。开明的人会输入sudo !!
。Bash 允许你使用或禁用
!
shell 中的处理。你可以在 Zsh 中使用 禁用它。set +o histexpand
set +H
set -K
答案2
除了在 shell 历史扩展中的使用之外,还涵盖Android Dev 的回答,最常见的用途是表达否定或集合补集。例如,在简单的 shell 通配符中
ls [!a-c]*
列出文件除了那些从范围内的字符开始a-c
。您还可能会看到用插入符号代替感叹号[^a-c]
(借用自正则表达式语法)写成的格式,尽管后一种格式不符合 POSIX 标准。
Bash 将补集的概念扩展到整个模式,扩展的 shell 全局变量例如
ls !(*.txt)
将列出除以扩展名结尾的文件之外的所有文件.txt
。
一些单独的命令也可以独立地用作!
否定或逻辑补充 - 例如
find ! -name '*.txt'
尽管 GNUfind
至少-not
在这种情况下也支持更长的形式(尽管这不符合 POSIX 标准)。
您的例子似乎混淆了最后两种用法 - 它看起来像一个扩展的 shell glob,但是作为find
命令的一部分出现,而这样的 shell 扩展是无效的1。
1但是,可以使用扩展的 shell glob 来构造目录搜索find
-find !(foo*)/ -name '*.bar'
例如