mac os x终端批量重命名

时间:2014-06-08 04:24:25

标签: macos bash shell file-rename

我有一个包含一系列文件的文件夹:

prefix_1234_567.png
prefix_abcd_efg.png

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

prefix_567.png
prefix_efg.png

感谢 相关但不完全解释: how can I batch rename files using the Terminal? Regex to batch rename files in OS X Terminal

7 个答案:

答案 0 :(得分:196)

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

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

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

注意:echo位于mv之前,以执行干运行。删除它以执行实际重命名。

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

  • "${f/_*_/_}"bash parameter expansion的应用:(第一个)子字符串匹配模式_*_被替换为文字_,有效地削减了中间令牌从名字。
  • 请注意,_*_模式(通配符表达式,也用于globbing),而不是正则表达式(要了解模式,运行man bash并搜索Pattern Matching)。

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

brew install rename

以下是使用rename的顶部命令的等效内容:

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

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

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

[1]大多数实用程序支持的特殊参数--的目的是表明后续参数应被视为操作数(值),甚至如果他们看起来像选项那样期刊,因为-作为Jacob C.注释。

答案 1 :(得分:86)

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

brew install rename

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

rename -nvs searchword replaceword *

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

更多信息:man rename

答案 2 :(得分:12)

您可以使用sed:

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

结果:

prefix_567.png prefix_efg.png

*首先进行干运行,最后用mv替换echo

说明:

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:2)

您可以使用rename安装brew命令。只需brew install rename并使用它。

答案 5 :(得分:1)

试试这个

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

这是另一种方式:

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

答案 6 :(得分:1)

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

此命令对当前目录中的所有文件进行操作,使用 --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.

更多重命名器用法示例here