这些是功能强大的命令,可以非常快速地进行大量更改 - 请在一小部分数据的副本上进行测试。
方法 1 - 使用“重命名”(Perl 工具)
这应该与rename
您可以使用以下命令在 macOS 上安装它:
brew install rename
命令是:
rename --dry-run -N "00001" 's/.jpg$/_$N.jpg/' *jpg
去除--dry-run
实际执行该命令,而不仅仅是告诉您它会做什么。
方法 2 - 使用 GNU Parallel
或者,这应该与GNU 并行您可以使用以下命令在 macOS 上安装它:
brew install parallel
命令是:
find . -name \*.jpg -print0 | parallel -0 --dry-run mv {} {.}_{#}.jpg
where:
-
{}
means “当前文件”,
-
{.}
means “当前文件减去扩展名”, and
-
{#}
means “(连续的)工作编号”
去除--dry-run
实际执行该命令,而不仅仅是告诉您它会做什么。
您提到您想要一个偏移量,因此以下内容适用于偏移量 3:
find . -name \*.jpg -print0 | parallel -0 'printf -v new "%s_%05d.jpg" "{.}" $(({#}+3)); echo mv "{}" "$new"'
方法 3 - 无需额外软件
这应该仅使用标准的内置工具即可工作:
#!/bin/bash
for f in *.jpg; do
# Figure out new name
printf -v new "%s_%05d.jpg" "${f%.jpg}" $((cnt+=1))
echo Would rename \"$f\" as \"$new\"
#mv "$f" "$new"
done
去除#
在倒数第二行中实际进行重命名。
方法 4 - 无需额外软件
这应该仅使用标准的内置工具即可工作。请注意,macOS 附带安装了 Perl,这应该会更快,因为它不会启动新的mv
与之前的方法一样,对 40,000 个文件中的每个文件进行处理。相反,Perl 仅启动一次,它读取由 传递给它的以 null 结尾的文件名find
然后为每个执行库调用:
find . -name \*.jpg -print0 | perl -0 -e 'while(<>){ ($sthg=$_)=~s/.jpg//; $new=sprintf("%s_%05d.jpg",$sthg,++$cnt); printf("Rename $_ as $new\n"); }'
如果看起来正确,请更改最后一行,以便它实际上执行重命名,而不仅仅是告诉您它将做什么:
find . -name \*.jpg -print0 | perl -0 -e 'while(<>){ ($sthg=$_)=~s/.jpg//; $new=sprintf("%s_%05d.jpg",$sthg,++$cnt); mv $_, $new; }'