Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在终端中批量重命名文件?_Macos_Shell_File Rename_Batch Rename - Fatal编程技术网

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

Macos 如何在终端中批量重命名文件?,macos,shell,file-rename,batch-rename,Macos,Shell,File Rename,Batch Rename,我想将目录中的文件重命名为序列号 stars_01_012.png stars_01_014.png stars_01_015.png stars_01_017.png stars_02_012.png stars_02_014.png stars_02_015.png stars_02_017.png 把它换成 stars_01_001.png stars_01_002.png stars_01_003.png stars_01_004.png stars_02_001.png stars

我想将目录中的文件重命名为序列号

stars_01_012.png
stars_01_014.png
stars_01_015.png
stars_01_017.png
stars_02_012.png
stars_02_014.png
stars_02_015.png
stars_02_017.png

把它换成

stars_01_001.png
stars_01_002.png
stars_01_003.png
stars_01_004.png
stars_02_001.png
stars_02_002.png
stars_02_003.png
stars_02_004.png
亲属,但不完全:
只是一个粗略的答案,为什么要使用终端脚本? 您只需使用Finder的重命名功能即可 通过在示例“stars_01_01”中选择所有文件的公共部分并将其替换为“stars_01_00”,这将产生相同的结果,而无需编写具有以下内容的脚本:


sed的#stars#u 01#u 01#stars#u 00#g'

您还可以使用终端命令行创建applescript脚本。 下面是要在脚本编辑器中复制的脚本 使用扩展名(在您的示例.png中)设置要重命名的shell脚本“ls您的文件的路径”,该扩展名提供:

**set thefile to do shell script "ls The_path_of_your_files/*.png"

set AppleScript's text item delimiters to return
set chFile to text items of thefile
set AppleScript's text item delimiters to ""
set n to count chFile
repeat with i from 1 to n
set rnFile to item i of chFile
set nwname to (do shell script "echo" & quoted form of rnFile & "| sed 's # stars_01_01 # stars_01_00 #'")
         set endFile to (do shell script "mv -f" & quoted form of rnFile & "" & quoted form of nwname)
end repeat**

这相当于Finder的重命名多个文件功能

您可以使用
重命名
执行此操作,您可以使用自制在macOS上安装此功能,方法是:

brew install rename
该命令如下所示:

rename --dry-run -X -e 'my @parts=split /_/; my $this=$parts[0].$parts[1]; if(!defined($ENV{previous}) || $this ne $ENV{previous}){$ENV{previous}=$this; $ENV{N}=0}; $ENV{N}=$ENV{N}+1; $_ = $parts[0]."_".$parts[1]."_".$ENV{N}' *png
#!/bin/bash

rename --dry-run -X -e '
      my @parts=split /_/;                      # split filename into parts based on underscore
      my $this=$parts[0].$parts[1];             # save first two parts of filename in $this
                                                # see if it is a new stem
      if(!defined($ENV{previous}) || $this ne $ENV{previous}){
         $ENV{previous}=$this; $ENV{N}=0};      # save new initial part, reset N
      $ENV{N}=$ENV{N}+1;                        # increment N
      $_ = $parts[0]."_".$parts[1]."_".$ENV{N}  # formulate new filename from parts
    ' *png
样本输出

'stars_01_012.png' would be renamed to 'stars_01_1.png'
'stars_01_014.png' would be renamed to 'stars_01_2.png'
'stars_01_015.png' would be renamed to 'stars_01_3.png'
'stars_01_017.png' would be renamed to 'stars_01_4.png'
'stars_02_012.png' would be renamed to 'stars_02_1.png'
'stars_02_014.png' would be renamed to 'stars_02_2.png'
'stars_02_015.png' would be renamed to 'stars_02_3.png'
'stars_02_017.png' would be renamed to 'stars_02_4.png'
'stars_88_099.png' would be renamed to 'stars_88_1.png'
说明:

my@parts=split/\uu/
使用下划线作为分隔符将文件名拆分为3个部分

my$this=$parts[0]。$parts[1]
将前两部分简单地连接在一起保存,例如“stars01”

if
语句测试前两部分中的任何一部分是否已更改,然后

$ENV{previous}=$this;$ENV{N}=0
将文件名的当前干保存在名为
previous
的环境变量中,并将当前顺序计数器保存在另一个环境变量
N

$ENV{N}=$ENV{N}+1
递增顺序计数器,并且

$\=$parts[0]。“\..$parts[1]。“\..$ENV{N}
从各个部分创建新的输出文件名

如果所有这些看起来都是正确的,请删除
--干运行
,然后再次运行它-可能是在备用目录中,其中包含文件的副本,直到您确定一切正常为止:-)


上述内容可能更容易阅读,如下所示:

rename --dry-run -X -e 'my @parts=split /_/; my $this=$parts[0].$parts[1]; if(!defined($ENV{previous}) || $this ne $ENV{previous}){$ENV{previous}=$this; $ENV{N}=0}; $ENV{N}=$ENV{N}+1; $_ = $parts[0]."_".$parts[1]."_".$ENV{N}' *png
#!/bin/bash

rename --dry-run -X -e '
      my @parts=split /_/;                      # split filename into parts based on underscore
      my $this=$parts[0].$parts[1];             # save first two parts of filename in $this
                                                # see if it is a new stem
      if(!defined($ENV{previous}) || $this ne $ENV{previous}){
         $ENV{previous}=$this; $ENV{N}=0};      # save new initial part, reset N
      $ENV{N}=$ENV{N}+1;                        # increment N
      $_ = $parts[0]."_".$parts[1]."_".$ENV{N}  # formulate new filename from parts
    ' *png
如果要将数字归零,请将最后一行更改为以下数字:

  $_ = sprintf("%s_%s_%03d",$parts[0],$parts[1],$ENV{N})  # formulate new filename from parts
注意


我将以前的文件前缀和顺序计数器保存到环境变量中,以在文件之间保留它们-可能有更简单的方法-如果有人知道,请ping我!谢谢。

您的文件的名称是否与此完全相同?或者是否有一些文件以(
planets\u 01
)开头?或者有3个下划线?或3组数字?或some JPEG?我想我可以用
$main::previous
代替
$ENV[previous]
但是,虽然它可能会更快,但是有可能与
重命名脚本中的变量发生冲突?谢谢你,马克。你是个英雄。它可以工作,但是我可以问一下我是否可以保持最后部分的3位数字不变吗?你认为有可能吗?我在接近尾声时添加了一个关于如何操作的注释-请再看一看。谢谢你,妈妈rk!这完全解决了问题,你是一个英雄!谢谢;)很高兴它为你工作。祝你的项目好运!谢谢,但我需要数字停留在3位,当它达到10位时,它将生成4位数字:stars_01_009 stars_01_0010