如何在终端中批量重命名文件?
How to batch rename files in a terminal?
我想将目录中的文件重命名为序号。
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
亲戚但不完全是:
How to Batch Rename Files in a macOS Terminal?
How can I batch rename files using the Terminal?
只是一个粗略的回答,为什么要使用终端脚本?
您可以只使用 Finder 及其重命名功能
通过在示例“stars_01_01”中选择所有文件的公共部分并将其替换为“stars_01_00”,这将导致相同的结果,而无需使用 :[=10= 编写脚本]
sed 's#stars_01_01#stars_01_00#g'
您还可以使用终端命令行创建 applescript 脚本。
在脚本编辑器中复制的脚本下方
将文件设置为执行 shell 脚本“ls The_path_of_your_files”,您希望重命名“”具有共同的扩展名(在您的示例中为 .png),它给出:
**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的重命名多个文件功能
你可以用 rename
来完成,你可以用 homebrew 安装在 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
示例输出
'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 /_/
使用下划线作为分隔符将文件名分成 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}
从各个部分创建新的输出文件名。
如果一切看起来都正确,请再次删除 --dry-run
和 运行 - 可能在带有 copy 的 spare 目录中 个文件,直到您确定一切正常 :-)
上面这样读起来可能更容易:
#!/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
注:
我将之前的文件前缀和顺序计数器保存到环境变量中,以便在文件之间保存它们 - 可能有更简单的方法 - 如果有人知道,请联系我!谢谢。
我想将目录中的文件重命名为序号。
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
亲戚但不完全是: How to Batch Rename Files in a macOS Terminal? How can I batch rename files using the Terminal?
只是一个粗略的回答,为什么要使用终端脚本? 您可以只使用 Finder 及其重命名功能 通过在示例“stars_01_01”中选择所有文件的公共部分并将其替换为“stars_01_00”,这将导致相同的结果,而无需使用 :[=10= 编写脚本]
sed 's#stars_01_01#stars_01_00#g'
您还可以使用终端命令行创建 applescript 脚本。 在脚本编辑器中复制的脚本下方 将文件设置为执行 shell 脚本“ls The_path_of_your_files”,您希望重命名“”具有共同的扩展名(在您的示例中为 .png),它给出:
**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的重命名多个文件功能
你可以用 rename
来完成,你可以用 homebrew 安装在 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
示例输出
'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 /_/
使用下划线作为分隔符将文件名分成 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}
从各个部分创建新的输出文件名。
如果一切看起来都正确,请再次删除 --dry-run
和 运行 - 可能在带有 copy 的 spare 目录中 个文件,直到您确定一切正常 :-)
上面这样读起来可能更容易:
#!/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
注:
我将之前的文件前缀和顺序计数器保存到环境变量中,以便在文件之间保存它们 - 可能有更简单的方法 - 如果有人知道,请联系我!谢谢。