如何在Bash中列出文件名指定位置包含任意整数的文件?
解决Bash脚本中过滤含整数版本号的Jar文件问题
看起来你想要筛选出文件名格式为[名称]-[整数].jar的文件,同时统计每个名称对应的这类文件数量对吧?你的原脚本里有几个需要调整的地方,我来一步步帮你修正:
原脚本的问题点
- 用
ls遍历文件不安全:如果文件名包含空格、特殊字符,$(ls *.jar | sort -u)会把文件名拆分成多个单词,导致遍历出错。 - 版本号提取错误:
version=${version%"*.jar"}里的双引号是多余的,应该用${version%.jar}来去掉.jar后缀。 - 计数逻辑不符合需求:
ls ${name}-* | wc -l会匹配所有以${name}-开头的文件,而不是只匹配后面带整数的,而且同样存在ls的安全问题。
修正后的方案
首先,我们可以开启Bash的扩展glob功能,用来精准匹配带整数的文件名;同时用更安全的glob遍历文件,不用ls。
完整修正脚本
# 开启扩展glob,支持+([0-9])这类整数匹配模式 shopt -s extglob # 直接用glob遍历所有jar文件,避免ls的问题 for file in *.jar; do # 跳过不存在的情况(比如没有jar文件时) [[ -f "$file" ]] || continue # 提取名称部分:去掉最后一个"-"及后面的内容 name=${file%-*} # 提取版本号:去掉最后一个"-"前面的内容,再去掉.jar后缀 version=${file##*-} version=${version%.jar} # 匹配当前name下,后缀是整数的jar文件,用printf统计数量(避免ls的问题) # +([0-9])表示匹配一个或多个数字 fcount=$(printf '%s\n' "${name}-"+([0-9]).jar | wc -l) # 输出信息 echo "名称: $name" echo "当前文件: $file" echo "版本号: $version" echo "对应整数版本文件数量: $fcount" echo "---" done # 关闭扩展glob(可选,如果你之后不需要的话) shopt -u extglob
关键细节说明
- 扩展glob的
+([0-9]):这个模式会匹配一个或多个数字,正好满足你要找的“指定位置包含任意整数”的需求。如果要允许数字前有可选的前缀(比如v1.0里的v),可以调整为${name}-[vV]?([0-9])+([0-9]).jar这类模式。 - 安全的文件计数:用
printf '%s\n'来输出匹配的文件,再用wc -l计数,避免了ls处理特殊文件名时的错误。 - 参数展开的正确用法:
${file%-*}:从右往左删除第一个-及后面的内容,提取名称${file##*-}:从左往右删除最后一个-及前面的内容,提取版本部分${version%.jar}:从右往左删除.jar后缀
如果你需要只处理版本号是纯整数的文件,还可以在脚本里加一个判断:
if [[ "$version" =~ ^[0-9]+$ ]]; then # 只处理版本号是纯整数的文件 echo "这是一个整数版本的文件" fi
内容的提问来源于stack exchange,提问作者Grebtsew
相关产品推荐
相关产品推荐

