如何批量重命名具有编号计数的文件夹中的40000个文件

时间:2018-07-16 20:13:39

标签: macos debian batch-rename

我需要对一个文件夹中的40000个文件进行批处理重命名,其末尾的数字如下: something.jpg到something_00001.jpg。我想使用重命名命令,但是任何有效的方法都可以。有帮助吗?谢谢!

2 个答案:

答案 0 :(得分:2)

这些功能强大的命令将非常快速地进行大量更改-请对一小部分数据进行测试。


方法1-使用“重命名”(Perl工具)

这应该与rename一起使用,您可以通过以下方式将其安装在macOS上:

brew install rename

命令为:

rename --dry-run -N "00001" 's/.jpg$/_$N.jpg/' *jpg

删除--dry-run即可实际执行命令,而不仅仅是告诉您它将执行的操作。


方法2-使用GNU Parallel

或者,它应该与 GNU Parallel 一起使用,您可以通过以下方式将其安装在macOS上:

brew install parallel

命令为:

find . -name \*.jpg -print0 | parallel -0 --dry-run mv {} {.}_{#}.jpg

其中:

  • {}表示“当前文件”
  • {.}表示“当前文件减去扩展名” ,并且
  • {#}的意思是“(顺序的)工作编号”

删除--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,并且它应该更快,因为它不会像以前的方法那样为40,000个文件中的每个文件启动新的mv进程。相反,Perl仅启动一次,它读取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; }'

答案 1 :(得分:0)

这是使用renamer的解决方案。

$ tree
.
├── beach.jpg
├── sky.jpg

$ renamer --path-element name --index-format %05d --find /$/ --replace _{{index}} *

$ tree
.
├── beach_00001.jpg
├── sky_00002.jpg