一次重命名数百个文件以进行正确排序

我有大量的文件,所有的名字都像1.jpg2.jpg3.jpg等等,直到1439.jpg ,然而,我的一个项目和字母顺序问题。 它通常按照1.jpg10.jpg11.jpg等顺序排列。

我需要的是一些命名文件的方法,使它们的格式如00001.jpg一直到01439.jpg

我怎样才能快速高效地完成这项工作?

Ubuntu附带一个名为rename的脚本。 它只是一个小的Perl脚本,具有许多强大的批量重命名function,但最好的(在这种情况下)是它在替换期间运行Perl的能力。 结果是一个真正紧凑的解决方案:

 rename 's/\d+/sprintf("%05d", $&)/e' *.jpg 

这与其他printf风格的答案类似,但它们都是为我们处理的。 上面的代码用于5位数字(包括可变数量的前导零)。

它将使用零填充版本搜索并替换它找到的第一个数字字符串,并保留文件名的其余部分。 这意味着您不必过于担心携带任何扩展名或前缀。

注意:这不是完全可移植的。 许多发行版使用util-linux包中的rename.ul作为它们的默认rename二进制文件。 这是一个显着发育不良的替代方案(参见man rename.ul ),它不会理解上述内容。 如果你想在没有使用Perl重命名的平台上这样做,请先了解如何安装它。


这是一个测试工具:

 $ touch {1..19}.jpg $ ls 10.jpg 12.jpg 14.jpg 16.jpg 18.jpg 1.jpg 3.jpg 5.jpg 7.jpg 9.jpg 11.jpg 13.jpg 15.jpg 17.jpg 19.jpg 2.jpg 4.jpg 6.jpg 8.jpg $ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg $ ls 00001.jpg 00005.jpg 00009.jpg 00013.jpg 00017.jpg 00002.jpg 00006.jpg 00010.jpg 00014.jpg 00018.jpg 00003.jpg 00007.jpg 00011.jpg 00015.jpg 00019.jpg 00004.jpg 00008.jpg 00012.jpg 00016.jpg 

一个示例前缀(我们没有做任何不同的事情):

 $ touch track_{9..11}.mp3 && ls track_10.mp3 track_11.mp3 track_9.mp3 $ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls track_09.mp3 track_10.mp3 track_11.mp3 
 for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done 

编辑

说明:

  • if [[ $f =~ [0-9]+\. ]] if [[ $f =~ [0-9]+\. ]]确保只重命名名称为数字(后跟一个点)的文件。
  • printf "%.5d" NUMBER添加前导零
  • "${f%.*}"剪切扩展名(.jpg),只留下数字
  • 第二个反引号后的.jpg再次添加文件扩展名。

请注意,这仅适用于作为数字的文件名。 左填充前导零到非编号文件将需要不同的格式。

如果您想尝试尝试此命令:

 for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done 

编辑2

通过确保仅重命名数字的文件名,使命令更安全。 请注意,任何名为00001.jpg的预先存在的文件都将被覆盖。

在python脚本下面。

该脚本将前导零添加到定义的位数。 如果名称大于该名称,则文件(名称)不受影响。

在一个重命名操作中组合不同的扩展可能会增加一些便利性。 要添加扩展名,只需将它们添加到元组中,例如extensions = (".jpg", ".jpeg", ".tiff")

将文本复制到空文件中,将其另存为rename.py ,输入文件目录( sourcedir )的正确路径,新名称所需的位数( number_ofdigits )和文件扩展名(s)重命名( extensions

通过命令运行它:

 python3 /path/to/script/rename.py 

剧本:

 #!/usr/bin/python3 import shutil import os sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg") files = os.listdir(sourcedir) for item in files: if item.endswith(extensions): name = item.split("."); zeros = number_ofdigits-len(name[0]) newname = str(zeros*"0")+name[0]+"."+name[1] shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname) 

编辑:

下面略有改进版本。 它会自动确定目录中的最长名称,并将前导零添加到最长名称的长度。

例:

 1.jpg 12.jpg 123.jpg 

变为:

 001.jpg 012.jpg 123.jpg 

无需设置位数。

 #!/usr/bin/python3 import shutil import os sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg") files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)] maxlen = len(max([f[2] for f in files], key = len)) for item in files: zeros = maxlen-len(item[2]) shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0]) 

在Perl中实现了一个重命名实用程序,这使得这非常简单:

 rename 's/\d+/sprintf("%05d",$&)/e' *.jpg 

第一个参数是为每个文件名计算的Perl表达式。

有一个GUI将执行此操作,称为pyRenamer,可以在存储库中找到。 安装,启动,选择您的目录,然后在“模式”选项卡上将“重命名的文件名模式”设置为“{num5}”,然后单击“重命名”按钮。 您还可以预览重命名之前会发生的事情。

 for file in `(find * -maxdepth 1 -type f -name "*.jpg")` do mv $file "000"$file done 

这很粗糙,因为它不会智能地重命名,需要考虑一个技巧。 但它应该可以帮助你排序。

更新:你有一个更完整的答案。