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

order filenames according to numbers in them, in bash

我需要将一堆文件转换成 bash 中的不同格式。我的文件名是这样的:

file_STUDY_6.nii
file_STUDY_7.nii
file_STUDY_8.nii

但它们并不总是以 6 开头,因此我需要它具有灵活性。我希望能够找到包含 "STUDY" 的所有文件,并能够将 #(此处为 6)最小的文件重命名为 study_run1

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

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

但我不确定如何命名第一个 study_run1、第二个 study_run2 等等

您可以在 bash 中使用此循环使用 process substitution:

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

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

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