mac os x终端批次重命名

问题描述 投票:109回答:7

我有一个文件夹,其中包含一系列名为:的文件

prefix_1234_567.png
prefix_abcd_efg.png

我想批量删除一个下划线和中间内容,因此输出为:

prefix_567.png
prefix_efg.png

相关但不完全解释:

bash macos shell terminal file-rename
7个回答
210
投票

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

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

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

注意:echo放在mv之前,以进行空运行。删除它以执行实际的重命名。

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

  • ["${f/_*_/_}"bash parameter expansion的应用:(第一个)子字符串匹配模式_*_被文字_代替,有效地从名称中切除了中间标记。
  • 请注意,_*_pattern(通配符表达式,也用于通配符),而不是regular expression(要了解模式,请运行man bash并搜索Pattern Matching )。

如果您经常发现自己为批量重新命名文件,请考虑安装专用工具,例如基于Perl的rename utility。在macOS上,您可以使用流行的软件包管理器rename进行安装,如下所示:

Homebrew

与使用brew install rename 的顶部命令等效:

rename

同样,此命令执行空运行;删除rename -n -e 's/_.*_/_/' *.png 以执行实际的重命名。

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

[1]特殊参数bash的目的(由大多数实用程序支持)是表示应将后续参数视为operands(值),即使它们是look类似于options,因为它以--开头,如-注释。


92
投票

要重命名文件,可以使用Jacob C.实用程序:

rename

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

brew install rename

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

更多信息:rename -nvs searchword replaceword *


12
投票

您可以使用sed:

man rename

结果:

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

*首先进行空运行,最后将prefix_567.png prefix_efg.png 替换为mv

说明:

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

7
投票

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

echo

2
投票

您可以使用for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done 安装rename命令。只需执行brew并使用它即可。


1
投票

使用brew install rename

mmv

1
投票

尝试一下

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

这里是另一种方式:

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done
© www.soinside.com 2019 - 2024. All rights reserved.