在bash中,根据文件名中的数字对文件名进行排序

在bash中,根据文件名中的数字对文件名进行排序,bash,filenames,renaming,Bash,Filenames,Renaming,我需要在bash中将一堆文件转换成不同的格式。我的文件名如下: file_STUDY_6.nii file_STUDY_7.nii file_STUDY_8.nii 但它们并不总是以6开头,所以我需要它的灵活性。我希望能够找到包含“STUDY”的所有文件,并能够将具有最低#(此处为6)的文件重命名为STUDY\u run1 我知道我可以通过执行以下操作来访问这些文件: for files in *STUDY*.nii; do echo files done 但是我不知道如何命名第一个

我需要在bash中将一堆文件转换成不同的格式。我的文件名如下:

file_STUDY_6.nii
file_STUDY_7.nii
file_STUDY_8.nii
但它们并不总是以6开头,所以我需要它的灵活性。我希望能够找到包含“STUDY”的所有文件,并能够将具有最低#(此处为6)的文件重命名为
STUDY\u run1

我知道我可以通过执行以下操作来访问这些文件:

for files in *STUDY*.nii; do
    echo files
done

但是我不知道如何命名第一个
study\u run1
,第二个
study\u run2
等等。

您可以在
bash
中使用以下循环:

验证后,您可以从上述脚本中删除
echo

PS:在许多系统上,
printf“%s\n”*STUDY*.nii
将给出已按字母顺序排序的文件名

i=0    
while read -r f; do
   echo mv "$f" "study_run$((++i))"
done < <(printf "%s\n" *STUDY*.nii | sort -t_ -nk3)
mv file_STUDY_6.nii study_run1
mv file_STUDY_7.nii study_run2
mv file_STUDY_8.nii study_run3