文件夹 /home/User/Desktop/DR 的内容
dr_subject00001_Z.nii
dr_subject00002_Z.nii
dr_subject00003_Z.nii
...等等(加 1 直到数字 40)
文件夹 /home/User/Desktop/rsfMRI 的内容
MCU_0001_01
MCU_0001_03
MCU_0002_03
...等等(这些值是随机的,但它们有一个范围,4位数字值可以达到40,但这些值可以重复(我们可以有两个0001),下划线后面的2位数字交替01 和 03 之间)。
我想做的是使用匹配从文件夹 rsfMRI 中查找数字“####_##”(4 位数字后跟下划线和其他 2 位数字),然后替换并重命名“#####”( DR 文件夹的文件名中的 5 位数字。
所以这样输出将会
dr_subject0001_01
dr_subject0001_02
dr_subject0002_03
我怎样才能做到这一点?
编辑: 两个文件夹中的文件数量相同。我希望它按顺序遍历每个文件夹中的文件,以便 DR 文件夹中的第一个文件与 rsfMRI 文件夹中的第一个文件匹配,依此类推。
答案1
您可以在 bash 中使用并行数组(假设每个文件夹中有相同数量的文件):
#!/bin/bash
drfiles=(DR/*)
mrifiles=(rsfMRI/*[0-9][0-9][0-9][0-9]_[0-9][0-9])
for((i=0; i < ${#drfiles[@]}; i++))
do
echo mv -- "${drfiles[i]}" "DR/dr_subject${mrifiles[i]#*_}"
done
该drfiles
数组包含 DR 文件;该mrifiles
数组包含 rsfMRI 目录中与以下模式匹配的文件:(某物)(4 位数字)下划线(2 位数字)。
然后,我们循环遍历该数组(以 DR 文件夹中的文件数量为关键字)并打印出示例 mv/rename 命令。重命名的来源只是当前索引的 DR 文件。重命名操作的目标是已知的前缀 DR/dr_subject,后跟修剪任何前导文本的相应 MRI 文件的结果,直到第一个下划线。如果 MRI 文件始终命名为“MCU”,您可以将重命名目标简化为:DR/dr_subject${mrifiles[i]#rsfMRI/MCU_}
。