mac os x终端批量重命名

kid*_*nim 111 macos bash shell terminal file-rename

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

prefix_1234_567.png
prefix_abcd_efg.png
Run Code Online (Sandbox Code Playgroud)

我想批量删除一个下划线和中间内容,以便输出

prefix_567.png
prefix_efg.png
Run Code Online (Sandbox Code Playgroud)

感谢相关但不完全解释: 如何使用终端批量重命名文件? 正则表达式批量重命名OS X终端中的文件

mkl*_*nt0 214

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

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done
Run Code Online (Sandbox Code Playgroud)

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

注意:echo前置mv是为了执行干运行.删除它以执行实际重命名.

您可以从命令行运行它或在脚本中使用它.

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

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

brew install rename
Run Code Online (Sandbox Code Playgroud)

这是相当于顶部的命令使用rename:

rename -n -e 's/_.*_/_/'  *.png
Run Code Online (Sandbox Code Playgroud)

同样,这个命令执行干运行; 删除-n以执行实际重命名.

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

[1] --大多数实用程序支持的特殊参数的目的是发出后续参数应该被视为操作数(值)的信号,即使它们看起来像是由于开始时的选项-,正如Jacob C.指出的那样.

  • 使用匹配替换(`.*` - >`$ 1`)的示例,例如将`Foo bar S01E01 biz baz.ext`重命名为`S01E01.ext`:`rename -n -e'/.*(S [0 -9] {2} E [0-9] {2}).*(\.[az] {2,4})/ $ 1 $ 2 /'*` (4认同)
  • 很好的答案,工作得很好.我也很感激你回去编辑它来解释它,并提供一个更优雅的解决方案,如果我重复这一点.再次,非常感谢,非常有帮助 (3认同)
  • 喜欢使用`echo`进行干运行的想法.谢谢你的提示! (2认同)
  • 强烈建议只执行“brew install rename” (2认同)

Dav*_*mas 92

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

brew install rename

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

rename -nvs searchword replaceword *
Run Code Online (Sandbox Code Playgroud)

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

更多信息: man rename

  • 谢谢,是的,它需要通过`brew install rename`安装 (4认同)
  • 优秀!喜欢"显示将要改变的东西"部分BEFORe它实际上重命名的东西! (3认同)
  • `GNU bash` (*x86_64-apple-darwin*) 的 `OS X` 版本不包含重命名实用程序。 (2认同)
  • 这个技巧很棒!我输入了`rename -vs GLYCOPHORIN GLYCC *`,现在它会自动重命名450多个文件。而且超级快。 (2认同)
  • 你也可以使用正则表达式.重命名's/123/onetwothree/g'* (2认同)

l'L*_*L'l 12

你可以使用sed:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)

结果:

prefix_567.png prefix_efg.png
Run Code Online (Sandbox Code Playgroud)

*首先做一个模拟运行,取代mv在年底与echo

说明:

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

  • 奥术?我喜欢这个! (2认同)

Jan*_*anB 7

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

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
Run Code Online (Sandbox Code Playgroud)