如何使用终端批量重命名文件?

77

我有一组文件,它们全部都是 nnn.MP4.mov 格式的。我该如何将它们重命名为 nnn.mov


1
安装muCommander。它有类似Total Commander的批量重命名器。为什么要浪费时间在那些100个字符的令人惊叹的批处理命令上呢? - Nakilon
@Nakilon 因为学习命令行的回报更大。 - Julien__
10个回答

102

首先,使用以下命令进行模拟运行(不会实际重命名任何文件):

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

如果一切看起来都正常,从第三行中删除echo以实际重命名文件。


19
无法弄清楚为什么它不起作用...有输出并且看起来像是在工作,但实际上并没有做任何事情。最后我终于发现,你需要删除ECHO语句才能使其真正起作用(至少在OSX 10.7上)。因此,如果保留echo语句,则可以测试重命名是否按照您的意愿进行,然后删除echo以使其起作用。因此,在Windows中,将*-hd.png文件重命名为*.png的等效方法是:for file in *.png do mv "$file" "${file/-hd/}" done - jsherk
4
要运行该脚本,需要执行以下步骤:
  1. 将脚本保存为 rename.sh 文件;
  2. 使其可执行 chmod 755 rename.sh
  3. 从您需要重命名文件和 shell 脚本所在的当前文件夹中启动它 ./rename.sh
  4. 如果结果正确,则从脚本中删除 echo 并再次启动它。
我需要为一组文件添加后缀。因此,我的脚本操作类似于:mv "$file" "${file}.jpeg"
- Anatolii Pazhyn
这是一个脚本,需要创建成文件并运行,对吗?有提示吗? - wide_eyed_pupil
像这样作为单行命令运行:for file in *.mov; do echo mv "$file" "${file/MP4./}"; done,分号 ; 起到了关键作用。 - Evi Song
4
对于其他用例,请注意该命令的一般格式: echo mv "$file" "${file/[replace_this]/[with_this]}" - HLeb

35

我刚刚成功地使用了Automator(这是我第一次使用),它真的很好用。我将这个自动化保存为“服务”。只用大约10秒钟的时间,就可以轻松地创建出可重复使用的东西:

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

现在,您可以右键单击Finder中的任何选择,进入“服务”菜单,选择“替换文本”,填写要更改或替换的文本内容 - 然后单击“继续”以应用已配置的更改。


我给它投了反对票,因为这个问题有“终端”标签。 - v42
很棒的答案,即使不是OP所问的。任何借口让我学习Automator都受欢迎 :-) 顺便说一下,它不能在文件夹上工作,但可以在多个选定的文件上工作。 - phatmann
太好了!非常感谢你。 - Youssef Moawad
太棒了!不用关心原帖作者! - Brody Robertson
你的意思是将“添加日期和时间”更改为“替换文本”吗? - wide_eyed_pupil
显示剩余2条评论

14

为了测试打印操作:

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

感谢您提供的一行代码解决方案。 - semihcosu

14

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

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

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

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


11
for n in *.MP4.mov
do
   mv $n $(echo $n | sed -e 's/.MP4//')
done

即使在没有参数替换的非常老的shell上,这也能正常工作,并且至少对我来说更易读一些。


我已经成功地将此应用于需要更改为“-IMG_”并在中间使用“”和“”进行修改的名称中使用“_MG_”的文件。效果非常好。谢谢! - Danijel-James W

5

在OS X中,当您在Finder中选择两个或多个文件时,会出现“重命名文件…”上下文菜单项。提供与上面的Automator答案相同的功能。虽然如果您希望进一步使用工具,Automator可以为您提供这些工具。

(我知道OP要求终端,但有33个人喜欢Automator的回答)


1
for i in `ls *png`;do echo mv $i "${i%%.*}"@xx."${i##*.}";done

1

vimv可以使用Vim的文本编辑功能重命名多个文件。

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

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


0
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,则会被覆盖,因此请小心使用 ^^


0
ls -1 *.MP4.mov | while read f; do mv -i "$f" "$(basename \"$f\" .MP4.mov)"; done

编辑:已完全重写。


如果它做了你想要的事情,就移除 -i。 - Philipp T.
我的意思是,它认为这一行应该有一个续行符。 - Jake Wilde
它所做的是将其重命名为“nnn.MP4.mov.mov”。 - Jake Wilde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接