Shell脚本中具有版本比较的文件名

时间:2018-06-28 12:52:52

标签: shell sh dos2unix

假设我的文件名为 abc-1.0.sh,xyz-1.0.sh,pqr-1.0.sh,abc-2.0.sh,abc-3.0.sh。

我正在尝试使用数组概念,但无法做到这一点。 我只希望文件名称为 abc-3.0.sh,xyz-1.0.sh,pqr-1.0.sh 。 我应该如何在.sh文件中这样做?

1 个答案:

答案 0 :(得分:0)

这是一个bash脚本(需要bash 4.3及更高版本),可以大致执行您要执行的操作:

filenames=( abc-1.0.sh xyz-1.0.sh abc-3.1.sh pqr-1.0.sh abc-2.0.sh abc-3.10.sh )

declare -A suffixes majors minors

for filename in "${filenames[@]}"; do
    stem=${filename%%-*}        # "abc-xx.yy.sh" --> "abc"
    suffix=${filename#*-}       # "abc-xx.yy.sh" --> "xx.yy.sh"

    # Figure out major and minor version from "$suffix"
    major=${suffix%%.*}         # "xx.yy.sh" --> "xx"
    minor=${suffix#*.}          # "xx.yy.sh" --> "yy.sh"
    minor=${minor%%.*}          # "yy.sh" --> "yy"

    if [ -z "${suffixes[$stem]}" ] ||
       [ "$major" -gt "${majors[$stem]}" ] ||
       ( [ "$major" -eq "${majors[$stem]}" ] &&
         [ "$minor" -gt "${minors[$stem]}" ] )
    then
        suffixes[$stem]=$suffix

        # Remember the largest parsed "xx.yy" for this stem
        majors[$stem]=$major
        minors[$stem]=$minor
    fi
done

for stem in "${!suffixes[@]}"; do
    printf '%s-%s\n' "$stem" "${suffixes[$stem]}"
done

此脚本输出

pqr-1.0.sh
xyz-1.0.sh
abc-3.10.sh

它解析文件名并提取 stem (破折号前的位)和后缀(破折号后的位),然后从后缀中提取主要版本和次要版本。然后,它使用一组关联数组suffixesmajorsminors将版本组件与该特定词干的先前找到的最新版本进行比较。如果以前没有看到过该茎,或者该茎的版本较低,则使用该茎的信息更新阵列。

最后,输出合并的数据。

此代码中的限制是文件名始终在表单上

stem-xx.yy.something

xxyy始终是整数。