【问题标题】:How can I batch rename files using the Terminal?如何使用终端批量重命名文件?
【发布时间】:2011-07-20 15:06:19
【问题描述】:

我有一组文件,都是nnn.MP4.mov。我怎样才能将它们重命名为 nnn.mov

【问题讨论】:

  • 安装muCommander。它具有 Total Commander 样式的批量重命名器。为什么要浪费时间在 100 个字符的令人兴奋的批处理命令上?
  • @Nakilon 因为学习命令行有更大的投资回报

标签: macos shell terminal file-rename batch-rename


【解决方案1】:

首先,使用以下内容进行试运行(实际上不会重命名任何文件):

for file in *.mov
do
  echo mv "$file" "${file/MP4./}"
done

如果一切正常,请从第三行删除 echo 以实际重命名文件。

【讨论】:

  • 无法弄清楚为什么这不起作用...有输出,看起来像,但实际上并没有做任何事情。好吧,我终于发现您需要删除 ECHO 语句才能真正让它做某事(无论如何在 OSX 10.7 上)。因此,如果您保留 echo 语句,那么您可以测试它以查看重命名是否会按您的意愿工作,然后删除 echo 以使其正常工作。所以与 ren *-hd.png *.png 的 Windows 等价的是: for file in *.png do mv "$file" "${file/-hd/}" done
  • 运行脚本需要: 1. 保存在rename.sh文件中; 2. 使其可执行chmod 755 rename.sh; 3. 从您有要重命名的文件和shell脚本./rename.sh的当前文件夹启动它; 4. 如果结果很好,从脚本中删除echo 并再次启动它。我需要为文件组添加扩展名。所以我在脚本中的操作是这样的:mv "$file" "${file}.jpeg"
  • 这是一个脚本,需要创建为文件然后运行对吗?线索?
  • 像这样作为单行 cmd 运行:for file in *.mov; do echo mv "$file" "${file/MP4./}"; done; 可以解决问题。
  • 对于其他用例,注意命令的一般格式:echo mv "$file" "${file/[replace_this]/[with_this]}"
【解决方案2】:

我刚刚成功使用了 Automator(我第一次遇到麻烦),而且效果非常好。我将自动化保存为服务。大约需要 10 秒才能使某些东西易于重复使用:

  1. 打开 Automator。
  2. 作为文档类型,选择“服务”。
  3. 更改服务将选定的“文本”接收到“文件和文件夹”。
  4. 考虑将“任何应用程序”更改为仅 Finder。
  5. 从侧边栏中选择“文件和文件夹”(在库下),然后从列出的操作中,在中心列中,将“重命名 Finder 项目”拖到右侧,并将其放在“将操作或文件拖到此处以构建您的工作流程。”
  6. 将您刚刚添加的操作从“添加日期或时间”更改为“按顺序执行”。
  7. 点击操作底部的“选项”并选中“工作流运行时显示此操作”选项。
  8. 点击“CMD+S”将服务保存为“替换文本”之类的内容..
  9. 完成!

现在您可以右键单击 Finder 中的任何选项,转到“服务”菜单并选择“替换文本”,填写您希望文本更改或替换的方式 - 然后单击“继续”以应用配置的更改。

【讨论】:

  • 我投了反对票,因为这个问题有“终端”标签。
  • 很好的答案,即使这不是 OP 所要求的。欢迎任何借口让我学习 Automator :-) 顺便说一句,它不适用于文件夹,但它适用于多个选定的文件。
  • 太棒了!谢谢你。
  • 太棒了!不要在乎OP!
  • 你不是说把“添加时间和日期”改成“替换文本”吗?
【解决方案3】:

在 mac OSX 上,您可以通过 Homebrew 安装 rename 命令:brew install rename

然后您可以在命令行上使用该文件夹中的查找/替换来重命名:

rename 's/\.MP4\././' *

您还可以使用man rename 查看更多选项。

【讨论】:

    【解决方案4】:

    测试打印操作:

    for file in *.MP4.mov; do j=`echo $file | cut -d . -f 1`;j=$j".mov";echo mv \"$file\" \"$j\"; done
    

    为了让它发挥作用:

    for file in *.MP4.mov; do j=`echo $file | cut -d . -f 1`;j=$j".mov";mv "$file" "$j"; done
    

    【讨论】:

    • 感谢一站式解决方案
    【解决方案5】:
    for n in *.MP4.mov
    do
       mv $n $(echo $n | sed -e 's/.MP4//')
    done
    

    这甚至可以在没有参数替换的非常旧的 shell 上工作,而且至少在我看来它更具可读性。

    【讨论】:

    • 我已将此应用于名称中使用 _MG_ 的文件,我需要通过在中间修改 ** 来完美地更改为 -IMG_。发挥了魅力。谢谢!
    【解决方案6】:

    OS X 有一个Rename Files… 上下文菜单项,当您在 Finder 中选择两个或更多文件时会调用该菜单项。提供与上述 Automator 回答相同的功能。如果您愿意,Automator 会为您提供更进一步的工具。

    (我知道 OP 要求提供终端,但其他 33 个喜欢 Automator 响应)

    【讨论】:

      【解决方案7】:
      for i in `ls *png`;do echo mv $i "${i%%.*}"@xx."${i##*.}";done
      

      【讨论】:

        【解决方案8】:

        vimv 允许您使用 Vim 的文本编辑功能重命名多个文件。

        输入 vimv 会打开一个列出所有文件的 Vim 窗口,您可以进行模式匹配、视觉选择等来编辑名称。退出 Vim 后,文件将被重命名。

        [免责声明:我是该工具的作者]

        【讨论】:

          【解决方案9】:
          ls -1 *.MP4.mov | while read f; do mv -i "$f" "$(basename \"$f\" .MP4.mov)"; done
          

          编辑:完全重写。

          【讨论】:

          • 如果它做你想要的,删除 -i
          • 我的意思是,它认为应该有一个延续
          • 它所做的就是将其重命名为"nnn.MP4.mov".mov
          【解决方案10】:
          for i in *; 
          do j=`echo $i | cut -d . -f 1`; 
          j=$j".mov";
          mv $i $j; 
          done
          

          这将删除第一个点之前的所有内容并附加 .mov

          但是如果某些文件是例如hi.2.mov 和 hi.1.mov 一个会被覆盖,请谨慎使用^^

          【讨论】:

            猜你喜欢
            • 2014-07-28
            • 1970-01-01
            • 2015-03-13
            • 2010-11-19
            • 2010-10-17
            • 1970-01-01
            • 2010-10-10
            • 2011-01-23
            • 1970-01-01
            相关资源
            最近更新 更多