我有大量的文件看起来像这样:
DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
我希望它们看起来像这样:
DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
我该怎么做?
答案 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
不需要rename
或sed
。只需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 \
测试