我正在尝试将文件名截断为最后 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”选项可让您在继续实际重命名之前查看重命名的内容。当您准备重命名这些文件时,请删除该选项。
充分理解该命令的步骤如下:
- 首先使用它
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*'
来查找将要更改的文件, - 如果步骤
(1)
失败,则与regex
文件名不匹配,调整正则表达式并更新您的问题,否则 当它按预期出现时,现在将该
-exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
部分添加到步骤(1)中的命令中,这样它就会找到并显示重命名的内容。find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
完成后,删除
-n
实际重命名这些文件的选项。如下所示:find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;