删除除bash脚本中的某些文件以外的文件

时间:2016-06-24 11:53:36

标签: linux bash scripting

我试图删除bash脚本中的一些文件并排除一些我之后仍然需要的文件。这就是我想出的:

if [ $var1 -eq 0 ]; then
    echo "$var1 = 0"
    shopt -s extglob
    rm /home/someone/!(file1.txt|file2.png|file3.pdf|file4.csv)
else
    echo "$var1 = 1"
    shopt -s extglob
    rm -rf /home/someone/!(file1.txt|file2.png|file3.pdf|file4.csv)
fi

如果我在shell上手动执行它,它会工作,但在脚本中它甚至不会调用if循环。一旦我注释掉包含“!”的行它有效。

2 个答案:

答案 0 :(得分:1)

您无法在块或函数中转换extglob shell选项。例如,这将失败:

shopt -u extglob

f() {
    shopt -s extglob
    echo *+(a)*
}
f

原因是在解析块时不执行命令shopt -s extglob ...因此解析器在遇到扩展的glob +(a)时会抱怨。见the relevant section of the glob page on Greg's wiki

  

extglob 更改了解析某些字符的方式。在shopt -s extglob和任何后续命令之间使用它有必要使用换行符(不仅仅是分号)。您无法在使用它们的组命令中启用扩展globs,因为整个块都已解析在评估shopt之前。请注意,典型的函数体是一个组命令。令人不快的解决方法可能是使用子shell命令列表作为函数体。

但是,如果你真的想要这种行为,可以使用eval,但实际上根本不推荐!相反,将shopt -s extglob移出块。实际上,习惯上将shell选项放在脚本的开头并在整个脚本中使用它们(如果适用)。如果您在整个脚本中使用extglob,我认为您不会遇到任何问题。

答案 1 :(得分:0)

正如@choroba暗示的那样,您需要以 bash my_script.sh ./my_script.sh 运行您的脚本以运行它击。如果您运行sh my_script.sh,则shell可能不支持extglob

告诉实际发生的事情的一种有用方法是将set -o xtrace添加到脚本的顶部(在shebang行之后)。这应该告诉你实际执行的内容。我还要添加set -o errexit以确保脚本在第一个失败命令时停止,并quote$var1的引用。