这个问题已经在这里有一个答案:
- 重命名基于模式的多个文件中的Unix 21个回答
我有文件的加载它看起来就像这样:
DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
我想他们是这样的:
DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
我怎样才能做到这一点?
这个问题已经在这里有一个答案:
我有文件的加载它看起来就像这样:
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的正则表达式;
rename 's/ABC/XYZ/' *.dat
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
没有rename
或sed
需要。 刚bash的参数扩展 。
像这样的东西会做。 该for
循环可能需要根据其档案名称,你想捕捉进行修改。
for fspec1 in DET01-ABC-5_50-*.dat ; do
fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
mv ${fspec1} ${fspec2}
done
你应该总是在你的数据的拷贝测试这些脚本,顺便说一下,在完全不同的目录。
你需要学习如何使用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
最好是先省略“-e SH”的部分,看看有什么会被执行。
所有这些问题的答案是简单和良好的。 但是,我总是喜欢一个互动的模式添加到这些脚本,这样我可以找到误报。
如果[[-n $ inInteractiveMode]
然后
回声-e -n “?$ oldFileName => $ newFileName \ n要做到这一点变化[Y / N]:”
读运行[[-z $运行|| “$运行” == “Y” || “$运行” == “Y”]] && MV “$ oldFileName” “$ newFileName”
科幻
或使互动模式的默认,并添加一个强制标志|自动化脚本(-f --force),或者如果你感觉大胆。 这不你慢下来太多:默认的回答是“是的,我要重命名”,所以你可以只打在每个提示回车键(因为``-z $运行\
测试。