Bash 如何在macOS终端中批量重命名文件?

Bash 如何在macOS终端中批量重命名文件?,bash,macos,shell,terminal,file-rename,Bash,Macos,Shell,Terminal,File Rename,我有一个文件夹,其中包含一系列文件,名为: prefix_1234_567.png prefix_abcd_efg.png 我想批量删除一个下划线和中间内容,以便输出为: prefix_567.png prefix_efg.png 相关但不完全解释: 在您的特定情况下,您可以使用以下bash命令(bash是macOS上的默认shell): 注意:如果文件名可能以-开头,请将-放在它们前面[1]: mv--“$f”“${f/*./}” 注意:echo在mv前面加上前缀,以便执行试运行。将

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

prefix_1234_567.png
prefix_abcd_efg.png
我想批量删除一个下划线和中间内容,以便输出为:

prefix_567.png
prefix_efg.png
相关但不完全解释:


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

注意:如果文件名可能以
-
开头,请将
-
放在它们前面[1]:
mv--“$f”“${f/*./}”

注意:
echo
mv
前面加上前缀,以便执行试运行。将其删除以执行实际重命名。

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

  • “${f/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”
    bash
    的一个应用程序:将(第一个)子字符串匹配模式
    \\\\\\\\\\
    替换为literal
    \\
    ,有效地从名称中删除中间标记
  • 请注意,
    .*.
    是一个模式(通配符表达式,也用于全局搜索),而不是正则表达式(要了解模式,请运行
    manbash
    并搜索
    模式匹配

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

brew install rename
下面是使用
rename
在顶部执行的等效命令:

rename -n -e 's/_.*_/_/'  *.png
同样,该命令执行一次试运行;删除
-n
以执行实际重命名

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

[1] 大多数实用程序都支持特殊参数
--
,它的目的是表明后续参数应被视为操作数(值),即使它们看起来像选项,因为它们以
-
开头,如注释所示。

您可以使用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

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

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

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

brew安装重命名

例如,要更改当前目录中所有文件名中的搜索字符串,请执行以下操作:

rename -nvs searchword replaceword *
删除“n”参数以应用更改


更多信息:
manrename
您可以使用
brew
安装
rename
命令。只需执行
brew安装重命名
并使用它。

使用
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.

还有很多重命名器使用示例。

看看NSString和NSMutableString的范围和子字符串方法,您是否考虑过这方面的非终端解决方案?自动机工作流可以轻松地执行这些类型的操作。您可以创建一个automator工作流来重命名所有文件,并将文本替换为空白的
.*.
。使其更为通用,以便也支持带有嵌入空格的文件名,会变得更加神秘:
ls*| xargs-I%bash-c'echo mv%”$(sed's@_.*_@_@“回答得很好,效果很好。我也很感激你回去编辑了它,以便对其进行更多的解释,如果我重复这一点,还可以提供更优雅的解决方案。再次非常感谢,这是一个使用匹配替换的示例(
*
->
$1
)例如,重命名
foobar S01E01 biz baz.ext
S01E01.ext
Rename-n-e's/*(s[0-9]{2}e[0-9]{2}.*(\.[a-z]{2,4})/$1$2/'*
喜欢使用
echo
进行干运行的想法。感谢您的提示!强烈建议您只需执行
brew-Rename
OS-code>(x86_64-apple-darwin)不包括重命名实用程序。谢谢,是的,它需要通过
brew安装重命名
来安装。这个技巧太棒了!我输入了
rename-vs-GLYCOPHORIN glyc*
,现在它自动重命名450多个文件。而且速度也非常快。太棒了!喜欢“显示将要更改的内容”这句话“在它实际重命名东西之前使用part!您也可以使用正则表达式。重命名's/123/onetwother/g'*鉴于这是OS X,正确的安装过程是
brew安装mmv
$ 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.