代码之家  ›  专栏  ›  技术社区  ›  TheCodeNovice

如何在使用bash保留文件名其余部分的同时,将数字的第一个实例归零

  •  -1
  • TheCodeNovice  · 技术社区  · 3 年前

    我已经和这件事纠缠了一段时间,我被卡住了。我在笔记本电脑上被宠坏了,因为我可以使用perl重命名,而且修复数字填充很简单。现在我在服务器上,重命名不起作用。我需要一种方法来调整文件上的拍打,如下所示

    foo-353-03-53-23.txt 
    

    本网站和其他网站上的大多数示例都会破坏填充过程中的所有内容,这对我没有帮助,因为我的文件名中有元数据。

    我正在寻找结果,以产生以下

    foo-000353-03-53-23.txt
    

    提前谢谢。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Léa Gris    3 年前

    拆分字符串并重新格式化:

    #!/usr/bin/env bash
    
    oldname='foo-353-03-53-23.txt'
    
    IFS=- read -r -d '' a n b <<<"$oldname"
    printf -v newname '%s-%06d-%s' "$a" "$((10#$n))" "${b%?}"
    
    # Debug dump variables
    declare -p oldname newname
    

    使用Bash的Regex捕获字符串elmeents的替代方法:

    #!/usr/bin/env bash
    
    oldname='foo-353-03-53-23.txt'
    
    # Capture string elements with Regex
    [[ $oldname =~ ([^0-9]+)([0-9]+)(.*) ]]
    
    # Reformat string elements
    printf -v newname '%s%06d%s' \
      "${BASH_REMATCH[1]}" "$((10#${BASH_REMATCH[2]}))" "${BASH_REMATCH[3]}"
    
    if [ ! -e "$newname" ]; then
      echo mv --no-clobber -- "$oldname" "$newname"
    else
      printf 'Cannot rename %s to %s, because %s already exist!\n' \
        "$oldname" "$newname" "$newname" >&2
    fi