【问题标题】:create new directory with incremental version using bash使用 bash 创建具有增量版本的新目录
【发布时间】:2020-11-22 14:22:26
【问题描述】:

我需要以增量方式生成新目录。下面是文件夹结构:-

1. Dockerfile
2. Makefile
3. manifests
    + 1.0.0
    + 1.0.1   

我想从变量中的现有目录中获取最新版本,即 last=1.0.1,将值 0.0.1 添加到 last 获取下一个版本,即 next=1.0.2。这样我就可以使用 mkdir manifests/$next 创建一个新目录,如下所示:-

1. Dockerfile
2. Makefile
3. manifests
    + 1.0.0
    + 1.0.1
    + 1.0.2   

我可以使用以下命令获取最新版本的目录名称:-

last=$(find manifests -type d -name '[0-9]*.[0-9]*.[0-9]*' -printf "%f\n" | sort -V | tail -n 1)

如何将 0.0.1 添加到变量中,以便 next=1.0.2 像这样:-

next=$(($last + 0.0.1))

【问题讨论】:

标签: linux bash awk scripting parameter-expansion


【解决方案1】:

每个增量都有一个函数:

#!/bin/bash

next() {
  local l="$1"
  local a="$2"
  local l1 l2 l3 a1 a2 a3

  IFS="." read l1 l2 l3 <<< "$l"
  IFS="." read a1 a2 a3 <<< "$a"
  
  echo "$(($l1+a1)).$(($l2+a2)).$(($l3+a3))"
}

last="1.0.1"
add="0.0.1"

new=$(next "$last" "$add")
echo "$new"

输出:

1.0.2

【讨论】:

  • 通常当你增加major时,你将minor和补丁号重置为0。当你增加minor时,你也将补丁号重置为0。
  • @LéaGris:是的,如果需要,可以添加此功能。
【解决方案2】:

使用普通的 bash 和 GNU 实用程序:

#!/bin/bash

cd manifests || exit
last=$(printf "%s\n" [0-9]*.*.*[0-9]/ | sort -Vr | head -n 1)
last=${last%?} # Remove the last character, that is, the '/'
[[ -d $last ]] && mkdir "${last%.*}.$(( ${last##*.} + 1))"

manifests 的父目录运行它。
它通过对包含至少两个点并以数字开头和结尾的目录进行版本排序来找到最新版本。然后它增加(加一)找到的最新版本的最后一个点之后的部分(假设该部分是整数)。

【讨论】:

    【解决方案3】:

    您可以使用awk

    next=`echo "$last" | awk -F. '{print $1"."$2"."($3+1)}'`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2018-09-03
      • 2015-09-14
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多