一次重命名数百个文件以进行正确排序
我有大量的文件,所有的名字都像1.jpg
, 2.jpg
, 3.jpg
等等,直到1439.jpg
,然而,我的一个项目和字母顺序问题。 它通常按照1.jpg
, 10.jpg
, 11.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
这很粗糙,因为它不会智能地重命名,需要考虑一个技巧。 但它应该可以帮助你排序。
更新:你有一个更完整的答案。