在命令行中从 * 中排除

Dav*_*vid 17 command-line bash rm

在很多情况下, a 的使用*几乎是不可避免的——例如,rm -rf *在一个包含数千个子文件夹和文件的文件夹中。

但是如果您只想从rm命令中排除一两个文件或文件夹怎么办?我GOOGLE了我的路周围,才发现好像挺复杂的解决方案,find . -depth -not \( -name 'one' -o -name 'two' \ -o -name 'three' \) -exec rm {} \;如规定在这里

是否有可能以更简单的方式做到这一点 - 没有绕道而行find?例如rm -rf --exclude='one' --exclude='two' --exclude='three' *像在 rsync 或只是rm -rf -e 'one','two','three' *

甚至可能排除某些事物的一般可能性*(因此其他命令,例如cp, mv, ... 不必实现自己的命令)?类似的东西*{'one','two','three'}

cho*_*oba 36

对于bash有一个叫shell选项extglob默认设置为停用,以保持与标准shell语法兼容。Extglob通过额外的运营商如补充语法!()?()@()和更多一些。

要打开extglob,请键入shopt -s extglob。保持它为当前用户类型打开echo 'shopt -s extglob' >> ~/.bashrc

对于 rm 示例:extglob您可以使用

rm -rf !(one|two|three)
Run Code Online (Sandbox Code Playgroud)

  • @David:你可以把`shopt` 东西放到你的`~/.bashrc` 中,它不会有什么坏处。 (3认同)