我有大量文件,所有文件的名称都类似1.jpg
、2.jpg
、3.jpg
等等1439.jpg
,但是,我的一个项目在字母排序方面存在问题。它通常会按照1.jpg
、10.jpg
等等的顺序排列11.jpg
。
我需要某种方式来命名文件,以便它们采用诸如 之00001.jpg
类的格式01439.jpg
。
我怎样才能快速而有效地做到这一点?
答案1
Ubuntu 附带一个名为 的脚本rename
。它只是一个小型 Perl 脚本,具有许多强大的批量重命名功能,但最好的功能(在本例中)是它能够在替换期间运行 Perl。结果是一个真正紧凑的解决方案:
rename 's/\d+/sprintf("%05d", $&)/e' *.jpg
这与此处的其他 -style 答案类似printf
,但一切都为我们处理好了。上面的代码适用于 5 位数字(包括可变数量的前导零)。
它会搜索并替换找到的第一个数字字符串,并将其替换为零填充版本,而保留文件名的其余部分。这意味着您不必太担心携带任何扩展名或前缀。
注意:这不是完全可移植的。许多发行版都使用软件包rename.ul
中的版本util-linux
作为其默认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
答案2
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
编辑
解释:
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 的现有文件都将被覆盖。
答案3
下面是一个 Python 脚本。
脚本会添加前导零,直到达到定义的位数。如果名称大于该位数,则文件(名称)不会改变。
在一个重命名操作中组合不同的扩展可能会带来一些便利。要添加扩展,只需将它们添加到元组中即可,例如extensions = (".jpg", ".jpeg", ".tiff")
。
将文本复制到一个空文件中,将其另存为rename.py
,输入文件目录的正确路径 ( sourcedir
)、新名称的位数 ( number_ofdigits
) 以及要重命名的文件扩展名 ( 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])
答案4
有一个名为 pyRenamer 的 GUI 可以执行此操作,可在存储库中找到。安装、启动、选择您的目录,然后在“模式”选项卡上将“重命名文件名模式”设置为“{num5}”,然后单击“重命名”按钮。您还可以预览重命名之前将发生的情况。