我有bash脚本
#!/bin/bash
set -euxo pipefail
I_PATH=$(pwd)
shopt -s extglob
for BASE in Adenina Citocina Guanina Timina
do
cd ${BASE}
rm !(*.psf|*.fdf|siesta|*.log)
cd ${I_PATH}
done
我希望它删除所有文件,除了被排除的文件。问题是bash执行如下命令
rm '!(*.psf|*.fdf|siesta|*.log)'
然后使用
脚本失败rm: cannot remove '!(*.psf|*.fdf|siesta|*.log)': No such file or directory
如何防止脚本将"添加到命令中?
usefind命令
for BASE in Adenina Citocina Guanina Timina
do
find ${BASE} -type f ! -name "*.psf" ! -name "*.fdf" ! -name "siesta" ! -name"*.log" -delete
done
似乎没有匹配您的glob,导致glob被视为文字字符串。在没有匹配
的情况下,使nullglob扩展为零。不带任何参数的rm
可能会打印错误,因此我们也使用rm -f
。
顺便说一下:Globs与大括号展开一起工作。你不需要循环或cd
。
shopt -s nullglob
shopt -s extglob
rm -f {Adenina,Citocina,Guanina,Timina}/!(*.psf|*.fdf|siesta|*.log)
或{Aden,Citoc,Guan,Tim}ina/...
,如果你想削减一些字节:)