如何批处理重命名文件在 MacOS 终端?

我有一个文件夹,里面有一系列文件名为:

prefix_1234_567.png
prefix_abcd_efg.png

我想 分批清除一个下划线和中间的内容,所以输出将是:

prefix_567.png
prefix_efg.png

相关但不能完全解释:

143649 次浏览

在您的特定情况下,您可以使用以下 bash命令(bash是 macOS 上的默认 shell) :

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

注意: 如果您的文件名以 -开头,请将 --放在它们之前[1] :
mv -- "$f" "${f/_*_/_}"

注意: echo被放在 mv之前,以便执行一次模拟运行。移除它以执行实际的重命名。

可以从命令行运行它,也可以在脚本中使用它。

  • "${f/_*_/_}"bash 参数展开的一个应用程序: (第一个)子字符串匹配模式 _*_被替换为文字 _,有效地从名称中删除中间标记。
  • 请注意,_*_模式(通配符表达式,也用于 globbing) ,而不是 正则表达式(为了了解模式,请运行 man bash并搜索 Pattern Matching)。

如果您发现自己经常批处理重命名文件,考虑安装一个专门的工具,比如基于 Perl 的 < a href = “ http://lasmasturm.org/code/rename/”rel = “ noReferrer”> rename实用程序 。 在 macOS 上,您可以使用流行的软件包管理器 自酿的安装它,如下所示:

brew install rename

下面是顶部使用 rename的命令的等价物:

rename -n -e 's/_.*_/_/'  *.png

同样,这个命令执行一次模拟运行; 删除 -n以执行实际的重命名。

  • bash解决方案类似,s/.../.../执行文本替换,但是与 bash不同的是,使用的是真 正则表达式

[1]大多数实用程序都支持特殊参数 --,它的目的是表明后续参数应该被视为 操作数(值) ,即使它们由于从 -开始而像 选择一样 听着,正如 雅各布 · C。所注意到的。

您可以使用 sed:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

结果:

prefix_567.png prefix_efg.png

* 先做一次演练,最后用 echo代替 mv

说明:

  • E: 仅对于1 sed 命令是可选的。
  • 要将输入打印到 sed,在这种情况下,在重命名之前它将是原始文件名
  • @ : 是/字符的替换,使 sed 更易读。也就是说,不使用 sed s/search/place/g,而使用 s@search@place@g
  • 我不知道。* : 下划线是指实际’的转义字符字符零次或多次(与正则表达式中的任何字符相反)
  • - n2: 表示有2个输出需要作为参数传递给 mv。对于来自 是的的每个输入,sed 命令将生成2个输出,然后提供给 mv。

我有一批这样的文件: be90-01.png,需要更改破折号来下划线。我用了这个,效果很好:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done

要重命名文件,可以使用 rename实用程序:

brew install rename

例如,要更改工作目录中所有文件名中的搜索字符串:

rename -nvs searchword replaceword *

删除’n’参数以应用更改。

更多信息: man rename

你可以使用 brew安装 rename命令。只要做 brew install rename并使用它。

使用 mmv

mmv '*_*_*' '#1_#3' *.png

试试这个

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

还有一种方法:

for file in Name*.png; do mv "$file" "01_$file"; done

由于以编程方式重命名文件是有风险的(如果错误的话,可能会造成破坏) ,我会使用一个专门为批量重命名而构建的具有模拟运行模式的工具,例如 改名

这个命令操作工作目录中的所有文件,使用 --dry-run,直到你确信输出看起来正确:

$ renamer --find "/(prefix_)(\w+_)(\w+)/" --replace "$1$3" -e name --dry-run *


Dry run


✔︎ prefix_1234_567.png → prefix_567.png
✔︎ prefix_abcd_efg.png → prefix_efg.png


Rename complete: 2 of 2 files renamed.

更多的更名使用例子 给你