解决Bash脚本删除匹配模式文件时的参数过多错误问题
问题原因
当工作目录中有多个匹配${workdir}/${target}*.dat的文件时,通配符会展开成所有匹配的文件名,导致[ -e ... ]中的参数数量超过test(即[)命令的处理上限,从而触发"too many arguments"错误。
可行解决方案
1. 直接使用rm -f(最简洁高效)
rm -f选项会自动忽略不存在的文件,无需提前判断,即使没有匹配文件也不会抛出错误:
target='file_pattern_to_be_removed' rm -f "${workdir}/${target}"*.dat
2. 循环遍历匹配文件
如果必须先判断再删除,可通过循环逐个处理,避免通配符展开导致的参数过多问题:
target='file_pattern_to_be_removed' for file in "${workdir}/${target}"*.dat; do # 过滤通配符未匹配到文件时的字面量字符串 if [ -e "$file" ]; then rm "$file" fi done
3. 利用nullglob选项处理空匹配
开启nullglob后,通配符未匹配到文件时会返回空列表而非原字符串,可通过判断列表长度决定是否删除:
target='file_pattern_to_be_removed' shopt -s nullglob # 开启空通配符处理 files=("${workdir}/${target}"*.dat) shopt -u nullglob # 关闭选项,避免影响后续脚本 if [ ${#files[@]} -gt 0 ]; then rm "${files[@]}" fi
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

