102

我有很多看起来像这样的文件:

DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat

我希望它们看起来像这样:

DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat

我怎样才能做到这一点?

4

6 回答 6

185

重命名命令有几种变体,在您的情况下,它可能很简单

rename ABC XYZ *.dat

您可能有一个采用 Perl 正则表达式的版本;

rename 's/ABC/XYZ/' *.dat
于 2009-09-08T08:56:56.227 回答
140
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

没有renamesed需要。只是 bash参数扩展

于 2013-07-22T13:44:23.950 回答
9

像这样的事情会做到这一点。根据for您希望捕获的文件名,可能需要修改循环。

for fspec1 in DET01-ABC-5_50-*.dat ; do
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
    mv ${fspec1} ${fspec2}
done

顺便说一句,您应该始终在数据副本上以及在完全不同的目录中测试这些脚本。

于 2009-09-08T08:57:33.027 回答
4

您需要学习如何使用 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'`
于 2009-09-08T08:47:50.693 回答
1

我喜欢用 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”部分,看看会执行什么。

于 2009-09-08T08:54:46.210 回答
1

所有这些答案都很简单而且很好。但是,我总是喜欢在这些脚本中添加交互模式,以便发现误报。

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 $runtest.

于 2009-09-09T05:15:23.887 回答