【问题标题】:Renaming part of a filename [duplicate]重命名文件名的一部分[重复]
【发布时间】: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

我该怎么做?

【问题讨论】:

    标签: bash filenames rename


    【解决方案1】:

    重命名命令有几种变体,在您的情况下,它可能很简单

    rename ABC XYZ *.dat
    

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

    rename 's/ABC/XYZ/' *.dat
    

    【讨论】:

    • 感谢一百万!这很容易(如果你知道怎么做;-))
    • 我不重命名适用于所有 Unix 变体。 Sed 是一个很好的后备方案。
    • 我在考虑用sed或者写代码;你的回答太棒了
    • 你的建议对我不起作用,但这个命令有效:$ find . -name '*ABC*' -exec rename 's/ABC/XYZ/' {} \;我在 Ubuntu 16.04 LTS
    • 这太容易了。惊人的。 :) 对于 Windows 上的任何人,PowerTools 都有 PowerRename,它有很多选项并且运行良好。
    【解决方案2】:
    for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
    

    不需要renamesed。只需 bash parameter expansion

    【讨论】:

    • 如果文件名有空格,你应该使用引号。请参阅下面的 sn-p...for file in *.dat ; do mv "$file" "${file//ABC/XYZ}" ; done
    • 在 OSX 上效果很好
    • 天哪,这太棒了!
    【解决方案3】:

    这样的事情就可以了。 for 循环可能需要根据您希望捕获的文件名进行修改。

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

    顺便说一下,您应该始终在数据的副本上测试这些脚本,并且在完全不同的目录中。

    【讨论】:

    • 对于 osx 这个东西。 rename 看起来很酷,但是 rename 的 brew install 似乎安装了一个 perl 脚本,该脚本在上面的示例中不起作用。一些谷歌搜索表明 rename 并非在所有 linux var 上都可用,并且实际上有一个 perl 版本在浮动。我花了大约 10 分钟的时间试图找出差异并做出决定——你知道这个答案很简单:)。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我喜欢用 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”部分,看看会执行什么。

      【讨论】:

      • 也许我做错了什么,但这对我的文件没有任何作用?
      • 您是否尝试使用“sh -e”?如果您尝试不使用它,则不应该这样做。它只是打印将执行的内容(“mv -v ... ...”行)作为检查一切是否正常的机会。如果你喜欢你看到的添加“sh -e”。
      • 并且只重命名一部分,即扩展名?我必须将很多 .TTF 文件重命名为 .ttf...
      【解决方案6】:

      所有这些答案都很简单而且很好。但是,我总是喜欢在这些脚本中添加交互模式,以便发现误报。

      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 测试。

      【讨论】:

        猜你喜欢
        • 2020-01-29
        • 2011-12-03
        • 2013-12-05
        • 2011-12-01
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 2014-01-06
        相关资源
        最近更新 更多