首页 文章

重命名文件名的一部分[重复]

提问于
浏览
73

这个问题在这里已有答案:

我有大量的文件,如下所示:

DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat

我希望它们看起来像这样:

DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat

我怎样才能做到这一点?

6 回答

  • 138

    所有这些答案都很简单 . 但是,我总是喜欢为这些脚本添加交互模式,以便我可以找到误报 .

    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` 测试 .

  • 4

    有一些重命名命令的变体,在你的情况下,它可能很简单

    rename ABC XYZ *.dat
    

    您可能有一个采用Perl正则表达式的版本;

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

    不需要 renamesed . 只是猛击parameter expansion .

  • 6

    像这样的东西会做到这一点 . 可能需要修改 for 循环,具体取决于您要捕获的文件名 .

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

    您应该总是在数据副本上测试这些脚本,顺便说一下,在完全不同的目录中 .

  • 1

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

    我喜欢用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”部分,看看将要执行的内容 .

相关问题