我有很多看起来像这样的文件:
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
您希望捕获的文件名,可能需要修改循环。
for fspec1 in DET01-ABC-5_50-*.dat ; do
fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
mv ${fspec1} ${fspec2}
done
顺便说一句,您应该始终在数据副本上以及在完全不同的目录中测试这些脚本。
您需要学习如何使用 sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed
也可以使用 for,这样您就可以遍历您的文件条目http://www.cyberciti.biz/faq/bash-for-loop/
你的命令看起来像这样,我旁边没有术语所以我无法检查
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
最好先省略“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),或者如果您觉得大胆。这不会让你太慢:默认响应是“是的,我确实想重命名”,所以你可以在每个提示符下按 enter 键(因为-z $run
test.