You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中列出文件名指定位置包含任意整数的文件?

解决Bash脚本中过滤含整数版本号的Jar文件问题

看起来你想要筛选出文件名格式为[名称]-[整数].jar的文件,同时统计每个名称对应的这类文件数量对吧?你的原脚本里有几个需要调整的地方,我来一步步帮你修正:


原脚本的问题点

  1. 用ls遍历文件不安全:如果文件名包含空格、特殊字符,$(ls *.jar | sort -u)会把文件名拆分成多个单词,导致遍历出错。
  2. 版本号提取错误:version=${version%"*.jar"}里的双引号是多余的,应该用${version%.jar}来去掉.jar后缀。
  3. 计数逻辑不符合需求: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:23:12