截断文件名

截断文件名

我正在尝试将文件名截断为最后 4 位数字(例如:将 941_S_5193 截断为 5193)。循环执行此命令以应用于大约 600 个文件的最直接方法是什么?

谢谢。-KM

答案1

rename命令可以很好地完成此任务:

# Note, -n flag used for testing only, remove for actual renaming
$ ls
941_P_5191  941_P_5192  941_P_5193  941_P_5194
$ rename -n 's/^(.*)_([0-9]{4})$/$2/'  ./*
./941_P_5191 renamed as 5191
./941_P_5192 renamed as 5192
./941_P_5193 renamed as 5193
./941_P_5194 renamed as 5194

您还可以在 bash 和 mvfor循环内删除前缀:

$ for f in ./*; do echo mv "$f" "${f##*_}"; done
mv ./941_P_5191 5191
mv ./941_P_5192 5192
mv ./941_P_5193 5193
mv ./941_P_5194 5194

注意:删除echo后才能进行实际重命名

答案2

我建议循环遍历目录中的项目,并 ls | tail -c 5列出每个文件的最后 4 位数字。

答案3

您给出了941_S_5193一个文件名,但再多几个会有帮助。我想出了这个find命令,它使用一个名为的示例文件执行此操作941_S_5193

find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;

示例文件名:

941_S_5194
923_D_5234
941_S_5193
941_S_5134
941_A_0034
941_C_9034

使用此命令:

find /users/desktop/km/neuroimage/struct/ -type f -iname  '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;

文件名产生以下变化:

rename(./941_S_5194, ./5194)
rename(./923_D_5234, ./5234)
rename(./941_S_5193, ./5193)
rename(./941_S_5134, ./5134)
rename(./941_A_0034, ./0034)
rename(./941_C_9034, ./9034)

结果:

0034
5134
5193
5194
5234
9034

注意:在重命名命令中使用“-n”选项可让您在继续实际重命名之前查看重命名的内容。当您准备重命名这些文件时,请删除该选项。

充分理解该命令的步骤如下:

  1. 首先使用它find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*'来查找将要更改的文件,
  2. 如果步骤(1)失败,则与regex文件名不匹配,调整正则表达式并更新您的问题,否则
  3. 当它按预期出现时,现在将该-exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;部分添加到步骤(1)中的命令中,这样它就会找到并显示重命名的内容。

    find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;

  4. 完成后,删除-n实际重命名这些文件的选项。如下所示:

    • find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;

相关内容