重命名多个文件,Bash 脚本,最好使用添加

重命名多个文件,Bash 脚本,最好使用添加

大家好,我在创建 Bash 脚本时遇到了一些问题。我有 7000 个图像文件(dicom)。这些文件属于一起,并且应该按顺序放置在一个目录中。然而,创建这些文件的程序似乎每 2048 个文件打开一个新的子文件夹,并从新开始。我想更改这些子文件夹中的图像名称。

假设我有一个包含 2048 张图像的文件夹(名为 IM_0001 到 IM_2048)。我有一个包含 900 张图像的后续文件夹。 (再次命名为 IM_0001 至 IM_0900)。

我想:

  1. For 循环遍历第二个文件夹中的所有文件。
  2. mv IM_{number} IM_{number+2048} (因此 IM_0001 变为 IM_2049 等等)

也就是说,基本上全部。有没有一种简单、有效的方法来做到这一点(或类似的方法)?不幸的是,我不太熟悉 Bash 语法,因此任何输入将不胜感激。名字应该相似!因此,简单地将第二个文件夹中的所有项目重命名为(例如)JM_0001 到 JM_0900 将导致我的导入程序(不幸的是,我需要使用该特定工具)搞砸。

谢谢你!

答案1

如果文件名没有扩展名:

for i in secondfolder/IM_* ; do mv "$i" "${i%_[0-9]*}_$[10#${i##*_}+2048]" ; done

答案2

简单的方法bash

for i in $(ls /path/to/your-directory); do
name=$(echo "$i" | cut -d '_' -f1)
num=$(echo "$i" | cut -d'_' -f2)
num1=$(( num + 2048 ))
mv "$i" "${name}_$num1"
done

答案3

这是使用 shell 脚本和 awk 执行此类操作的基本方法。

此示例脚本对于您的特定情况相当明确,它使用文件名中的第二个字段是一个有效的整数。并相信文件名中没有杂散的下划线。更通用的脚本将验证字段 2 只是数字,并使字段分隔符成为参数。它还假设没有文件扩展名(如 .img 或 .png)

#!/bin/sh
WORKDIR=/(要重命名的文件所在目录)
添加数量=2048
cd $WORKDIR
echo "旧文件 新文件"
ls IM_ * |在阅读时我
   newfile=`回显 $i | awk -F_ -v incby=$NUM2ADD '{t=$2 + incby;printf "IM_%s",t;}'`
   回显 $i $newfile
   # 试运行测试后,一旦确定结果,请将“echo”替换为“mv”。
完毕

由于很可能有文件扩展名,因此您可以将 awk 行更改为:

newfile=`回显 $i | awk -F[_.] -v incby=$NUM2ADD '{t=$2 + incby; printf "IM_%s.%s",t,$3;}'`

这会保留文件扩展名并使用下划线 _ 和句点作为字段分隔符。

相关内容