根据其中的数字对文件名进行排序,在 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
将给出已按字母顺序排序的文件名。
我需要将一堆文件转换成 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
将给出已按字母顺序排序的文件名。