当我在 Ubuntu 终端中使用以下代码时,它运行良好:
rm !(*.sh) -rf
但是如果我将同一行代码放在 shell 脚本(clean.sh)中并从终端运行该 shell 脚本,它会引发错误:
clean.sh脚本:
#!/bin/bash
rm !(*.sh) -rf
我收到的错误:
./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'
你能帮我吗?
答案1
rm !(*.sh)
是一种extglob
语法,意思是删除除具有扩展名的文件之外的所有文件.sh
。
在您的交互式bash
实例中,shell 选项extglob
处于开启状态:
$ shopt extglob
extglob on
现在,由于你的脚本正在子 shell 中运行,你需要extglob
在脚本开头添加以下命令来启用它:
shopt -s extglob
因此你的脚本如下所示:
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
编辑 :
要删除除.sh
扩展名之外的所有文件,请使用GLOBIGNORE
(因为您不想启用extglob
):
#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *
例子 :
$ ls -1
barbar
bar.sh
egg
foo.sh
spam
$ GLOBIGNORE='*.sh'
$ rm *
$ ls -1
bar.sh
foo.sh
答案2
好的,这是一条交叉帖子,但我必须写一个答案。;)
你可以find
使用
find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
答案3
您需要打开extglob
:
shopt -s extglob