重命名文件名的一部分

抱歉,这个愚蠢的问题,但我是一个新手。 我有大量的文件看起来像这样:

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正则expression式的版本;

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

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

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

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

你应该总是testing这些脚本的副本 ,顺便说一下,在完全不同的目录。

你需要学习如何使用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'` 

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

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

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

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

或者使交互模式成为默认模式,并为自动化脚本添加一个强制标志(-f | –force),或者如果您感觉很大胆。 这并不会让你减慢太多:默认的响应是“是的,我想重命名”,所以你可以在每个提示符下敲击回车键(因为`-z $ run \ test。