使用 bash 添加一个值来重命名文件

rename file by adding a value using bash

我在一个目录及其子目录中有一系列具有相似扩展名的文件。我想在基本名称的整数部分添加一个常量值。有什么办法可以使用 Bash 来实现吗?让我们举个例子。

之前: ../ParentDirectory/Directory/123-File.ext

整数部分加上20后(123+20=143): ../ParentDirectory/Directory/143-File.ext

我假设需要一系列 FIND 和 RENAME 命令,但我不确定如何操作!

假设:

  • 顶级目录是“ParentDirectory”及其子目录 包含要重命名的文件。
  • 文件的扩展名为“.ext”。
  • 文件名以数字开头,不包含其他数字 在文件名中间。

那么请你试试bash脚本:

#!/bin/bash

find ParentDirectory -type f -name "*.ext" | while IFS= read -r path; do
    dir=${path%/*}              # extract the directory name
    fname=${path##*/}           # extract the file name
    num=${fname//[^0-9]/}       # number part of the file name
    remain=${fname//[0-9]/}     # remaining part of the file name
    (( num += 20 ))             # add 20 to the number
    newpath="$dir/$num$remain"  # compose the new filename
    if [[ -f $newpath ]]; then  # make sure the new filename doesn't duplicate
        echo "$newpath already exists. skip renaming."
    else
        echo mv -- "$path" "$newpath"
                                # print the mv command
    fi
done

它将mv命令输出为干运行。如果输出看起来不错, 在 mv 命令之前删除 echo 并再次 运行。

如 Barmar 所建议,如果 perl rename 命令可用,请尝试 相反:

shopt -s globstar
rename -n 's/\d+(?!.*\/)/$& + 20/e' ParentDirectory/**/*.ext
  • 正则表达式 \d+(?!.*\/) 匹配数字 而不是 后跟一个斜杠。 它避免匹配目录名称中包含的数字。
  • rename命令末尾的e修饰符告诉perl 将替换 $& + 20 评估为 perl 表达式 而不是文字替换字符串。
  • ParentDirectory/**/*.ext 由于 shopt -s globstar 选项。
  • -n 选项仅打印文件名,不执行任何操作。如果输出看起来不错,则删除 -n.

请注意有两个不同的 rename 命令:“perl rename” 和“non-perl 重命名”取决于发行版。你可以确定 通过查看 man rename 安装了哪个。如果它 包括单词Perl,它是perl rename命令。