这个问题在这里已有答案:
我有大量的文件,如下所示:
DET01-ABC-5_50-001.dat ... DET01-ABC-5_50-0025.dat
我希望它们看起来像这样:
DET01-XYZ-5_50-001.dat ... DET01-XYZ-5_50-0025.dat
我怎样才能做到这一点?
所有这些答案都很简单 . 但是,我总是喜欢为这些脚本添加交互模式,以便我可以找到误报 .
if [[-n $ inInteractiveMode]] then echo -e -n“$ oldFileName => $ newFileName \ n你想做这个改变吗?[Y / n]:”read run [[-z $ run || “$ run”==“y”|| “$ run”==“Y”]] && mv“$ oldFileName”“$ newFileName”fi
或者将交互模式设置为默认值并为自动脚本添加强制标志(-f | --force),或者如果你减慢太多:默认响应是"yes, I do want to rename"所以你可以在每次提示时点击回车键(因为-z $ run` 测试 .
-z $ run
有一些重命名命令的变体,在你的情况下,它可能很简单
rename ABC XYZ *.dat
您可能有一个采用Perl正则表达式的版本;
rename 's/ABC/XYZ/' *.dat
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
不需要 rename 或 sed . 只是猛击parameter expansion .
rename
sed
像这样的东西会做到这一点 . 可能需要修改 for 循环,具体取决于您要捕获的文件名 .
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
最好先省略“sh -e”部分,看看将要执行的内容 .
6 回答
所有这些答案都很简单 . 但是,我总是喜欢为这些脚本添加交互模式,以便我可以找到误报 .
或者将交互模式设置为默认值并为自动脚本添加强制标志(-f | --force),或者如果你减慢太多:默认响应是"yes, I do want to rename"所以你可以在每次提示时点击回车键(因为
-z $ run
` 测试 .有一些重命名命令的变体,在你的情况下,它可能很简单
您可能有一个采用Perl正则表达式的版本;
不需要
rename
或sed
. 只是猛击parameter expansion .像这样的东西会做到这一点 . 可能需要修改
for
循环,具体取决于您要捕获的文件名 .您应该总是在数据副本上测试这些脚本,顺便说一下,在完全不同的目录中 .
你需要学习如何使用sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed
并且也可以使用,这样你就可以遍历文件条目http://www.cyberciti.biz/faq/bash-for-loop/
你的命令看起来像这样,我旁边没有一个术语,所以我无法检查
我喜欢用sed这样做 . 在你的情况下:
最好先省略“sh -e”部分,看看将要执行的内容 .