在 unix 中批量重命名:将 digits_*.* 交换为 *_digits.*

Batch rename in unix: swap digits_*.* into *_digits.*

如果名称与特定模式匹配,我需要批量重命名文件列表,模式以 1 个或多个数字开头,后跟下划线,然后是字母数字。例如:“123_ABC123.txt”(扩展名可以是任何东西,不必是 'txt')。

我认为正则表达式应该是这样的:

\d+_*.*

但我不确定如何在 Unix 中实现它,具体来说,我如何表达第一部分 (\d+) 应该与第二部分 (*) 交换中间有下划线?

谢谢!

您可以使用这个 rename command:

rename -n 's/^(\d+)_(.+)(\.[^.]+)$/_/' [0-9]*.*

123_ABC123.txt' would be renamed to 'ABC123_123.txt'

满意后可以删除 -n(干 运行)选项。

解释:

  • ^(\d+):匹配捕获组 #1 开头的 1+ 个数字
  • _:匹配一个_
  • (.+):匹配捕获组 #2
  • 中的 1+ 个任意字符
  • (\.[^.]+)$:在第 3 组行结束前匹配要捕获的点和扩展名
  • _:在捕获组 2 和 1 之间插入 _,并在
  • 中保留扩展名

使用您展示的示例,请尝试以下纯 BASH 解决方案。

这将打印 mv(重命名) 命令,一旦您对此感到满意,您就可以使用实际代码重命名文件。

for file in [0-9]*.*
do
   firstPart=${file%%_*}
   secondPart1=${file%.*}
   secondPart=${secondPart1#*_}
   extension=${file##*.}
   echo "File $file will be renamed to: ${secondPart}_${firstPart}.${extension}"
   echo "mv \"$file\" " "\"${secondPart}_${firstPart}.${extension}\""
done

显示的名为 123_ABC123.txt 的文件的输出如下:

File 123_ABC123.txt will be renamed to: ABC123_123.txt
mv "123_ABC123.txt"  "ABC123_123.txt"


注意: 一旦您对上述代码的结果感到满意,然后 运行 以下代码实际重命名文件:

for file in [0-9]*.*
do
   firstPart=${val%%_*}
   secondPart1=${val%.*}
   secondPart=${secondPart1#*_}
   extension=${val##*.}
   echo "File $file will be renamed to: ${secondPart}_${firstPart}.${extension}"
   mv "$file" "${secondPart}_${firstPart}.${extension}"
done