【发布时间】:2010-11-26 10:32:05
【问题描述】:
我有很多看起来像这样的文件:
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
【讨论】:
$ find . -name '*ABC*' -exec rename 's/ABC/XYZ/' {} \;我在 Ubuntu 16.04 LTS
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
不需要rename 或sed。只需 bash parameter expansion。
【讨论】:
for file in *.dat ; do mv "$file" "${file//ABC/XYZ}" ; done
这样的事情就可以了。 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
还可以使用 for,以便您可以遍历文件条目 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”部分,看看会执行什么。
【讨论】:
所有这些答案都很简单而且很好。但是,我总是喜欢在这些脚本中添加交互模式,以便发现误报。
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),或者如果您觉得很大胆。这并不会让你太慢:默认响应是“是的,我确实想重命名”,所以你可以在每个提示符下按 enter 键(因为 -z $run 测试。
【讨论】: