重命名文件名的一部分

时间:2009-09-08 08:45:20

标签: bash filenames rename

我有大量的文件看起来像这样:

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

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

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

我该怎么做?

6 个答案:

答案 0 :(得分:148)

有一些重命名命令的变体,在您的情况下,它可能就像

一样简单
rename ABC XYZ *.dat

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

rename 's/ABC/XYZ/' *.dat

答案 1 :(得分:97)

for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

不需要renamesed。只需bash parameter expansion

答案 2 :(得分:7)

这样的事情会做到这一点。可能需要修改for循环,具体取决于您要捕获的文件名。

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

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

答案 3 :(得分:4)

您需要了解如何使用sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

并且还可以使用,以便您可以遍历文件条目http://www.cyberciti.biz/faq/bash-for-loop/

你的命令看起来像这样,我没有一个术语,所以我无法检查

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`

答案 4 :(得分: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”部分以查看将要执行的内容。

答案 5 :(得分:1)

所有这些答案都很简单。但是,我总是喜欢为这些脚本添加交互模式,以便找到误报。

  

if [[-n $ inInteractiveMode]]
  然后
    echo -e -n“$ oldFileName => $ newFileName \ n你想做这个改变吗?[Y / n]:”
  阅读运行

     

[[-z $ run || “$ run”==“y”|| “$ run”==“Y”]]&& mv“$ oldFileName”“$ newFileName”
  网络

或者将交互模式设为默认值并为自动脚本添加强制标记(-f | --force),或者如果您感觉大胆。这并没有减慢你的速度:默认响应是“是的,我确实想重命名”,所以你可以在每个提示符下点击回车键(因为`-z $ run \测试