大家好,我在创建 Bash 脚本时遇到了一些问题。我有 7000 个图像文件(dicom)。这些文件属于一起,并且应该按顺序放置在一个目录中。然而,创建这些文件的程序似乎每 2048 个文件打开一个新的子文件夹,并从新开始。我想更改这些子文件夹中的图像名称。
假设我有一个包含 2048 张图像的文件夹(名为 IM_0001 到 IM_2048)。我有一个包含 900 张图像的后续文件夹。 (再次命名为 IM_0001 至 IM_0900)。
我想:
- For 循环遍历第二个文件夹中的所有文件。
- 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;}'`
这会保留文件扩展名并使用下划线 _ 和句点作为字段分隔符。