我有很多这样的文件:
DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
我希望它们看起来像这样:
DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
我该如何做到这一点?
有几个重命名命令的变体,在您的情况下,可能很简单:
rename ABC XYZ *.dat
您可能有一个使用Perl正则表达式的版本;
rename 's/ABC/XYZ/' *.dat
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
不需要使用rename
或sed
命令,只需使用bash的参数展开功能。
for file in *.dat ; do mv "$file" "${file//ABC/XYZ}" ; done
- Haktan Suren可以像这样完成。根据您想要捕获哪些文件名,可能需要修改 for 循环。
for fspec1 in DET01-ABC-5_50-*.dat ; do
fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
mv ${fspec1} ${fspec2}
done
顺便提醒一下,您应该始终在数据的副本上以及完全不同的目录中测试这些脚本。
for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
我喜欢用sed来做这件事。在你的情况下:
for x in DET01-*.dat; do
echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/'
done | sh -e
所有这些答案都很简单而且不错。然而,我总是喜欢为这些脚本添加交互模式,以便我可以找到错误的结果。
if [[ -n $inInteractiveMode ]]
then
echo -e -n "$oldFileName => $newFileName\nDo you want to do this change? [Y/n]: "
read run
[[ -z $run || "$run" == "y" || "$run" == "Y" ]] && mv "$oldFileName" "$newFileName"
fi
或者将交互模式设为默认模式,并添加一个强制标志(-f | --force)用于自动化脚本或者如果你感觉大胆的话。这不会使你的速度变慢太多:默认响应是“是的,我想要重命名”,所以你可以在每个提示处只需按下回车键(因为有-z $run
测试)。
$ find . -name '*ABC*' -exec rename 's/ABC/XYZ/' {} \;
我使用的是Ubuntu 16.04 LTS操作系统。 - user3405291