运行以下命令时:
rm -rf !(file1|file2)
Run Code Online (Sandbox Code Playgroud)
删除除 file1和file2 之外的所有文件; 如预期.将此命令放在bash脚本中时:
#!/bin/bash
rm -rf !(file1|file2)
Run Code Online (Sandbox Code Playgroud)
或使用bash -c运行它:
bash -c "rm -rf !(file1|file2)"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
syntax error ner unexpected token '('
Run Code Online (Sandbox Code Playgroud)
我尝试过使用设置shell选项
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
yeilding in:
bash -c "shopt -s extglob; rm -rf !(file1|file2)"
Run Code Online (Sandbox Code Playgroud)
根据以下内容启用glob:https: //superuser.com/questions/231718/remove-all-files-except-for-a-few-from-a-folder-in-unix以及其他一些问题.
它仍然不起作用,我很茫然.
首先,为安全起见,让我们进行测试echo !(file1|file2)而不是rm -rf !(file1|file2).
无论如何,bash在执行shopt -s extglob命令之前会对整个命令行进行一些解析.当bash遇到时(,该extglob选项尚未设置.这就是你得到错误的原因.
试试这个:
bash -O extglob -c 'echo !(file1|file2)'
Run Code Online (Sandbox Code Playgroud)
在您的脚本中,您只需要在依赖它之前将该选项作为单独的命令行打开:
#!/bin/bash
shopt -s extglob
echo !(file1|file2)
Run Code Online (Sandbox Code Playgroud)
你也可以用-c旗子做到这一点:
bash -c 'shopt -s extglob
echo !(file1|file2)'
Run Code Online (Sandbox Code Playgroud)
或者甚至像这样:
bash -c $'shopt -s extglob\necho !(file1|file2)'
Run Code Online (Sandbox Code Playgroud)