重命名文件名的一部分

116

我有很多这样的文件:

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个回答

194

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

rename ABC XYZ *.dat

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

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

1
非常感谢!这很简单(如果你知道怎么做;-)) - not_a_geek
2
不重命名在所有Unix变体中都可用。Sed是一个很好的备选方案。 - Jim
对我不起作用,什么也没发生 - dhein
7
您的建议对我没有用,但是这个命令可以解决问题:$ find . -name '*ABC*' -exec rename 's/ABC/XYZ/' {} \; 我使用的是Ubuntu 16.04 LTS操作系统。 - user3405291
1
对于任何使用Windows的人来说,PowerTools具有PowerRename功能,它具有许多选项并且非常有效。太简单了,真棒! :) - Mats
显示剩余7条评论

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

不需要使用renamesed命令,只需使用bash的参数展开功能。


20
如果文件名中有空格,您应该使用引号。请参见下面的代码片段... for file in *.dat ; do mv "$file" "${file//ABC/XYZ}" ; done - Haktan Suren
1
在OSX上运行得非常好。 - Justin Mitchell
哇,这太棒了! - O.rka

9

可以像这样完成。根据您想要捕获哪些文件名,可能需要修改 for 循环。

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

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


对于OSX来说,这是个好东西。重命名看起来很酷,但是通过brew安装的重命名似乎安装了一个不符合上面示例的perl脚本。一些搜索表明,rename并不适用于所有的Linux变量,并且实际上有一个perl版本在流传。我试图花了大约10分钟来解决差异,但最终决定 - 你知道这个答案足够简单 :)。 - j03m

5

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”部分,看看将会执行什么。

也许我做错了什么,但这对我的文件没有任何作用? - not_a_geek
你是在尝试使用“sh -e”吗?如果你没有使用它,那么命令将不会被执行。它只会打印出即将执行的命令(“mv -v ... ...”行),以方便检查一切是否正确。如果你满意所看到的,请添加“sh -e”。 - stribika
我只需要重命名文件的一部分,例如扩展名,比如将很多.TTF文件重命名为.ttf... - user41063

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)用于自动化脚本或者如果你感觉大胆的话。这不会使你的速度变慢太多:默认响应是“是的,我想要重命名”,所以你可以在每个提示处只需按下回车键(因为有-z $run测试)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接