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

Kaz*_*lfe 25 scripts batch-rename

我有很多文件,所有命名的东西都像1.jpg, 2.jpg, 3.jpg,等等1439.jpg,但是,我的一个项目和字母顺序有问题。它通常按1.jpg10.jpg11.jpg等顺序进行。

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

我如何才能快速有效地做到这一点?

Oli*_*Oli 37

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

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

这类似于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
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 它不使用任何 perl,只是提供了一个已经用 perl 编写的工具。 (2认同)

sмu*_*urf 21

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done
Run Code Online (Sandbox Code Playgroud)

编辑

解释:

  • 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
Run Code Online (Sandbox Code Playgroud)

编辑 2

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


Jac*_*ijm 8

下面是一个python脚本。

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

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

将文本复制到一个空文件中,另存为rename.py,输入文件目录的正确路径 ( sourcedir)、您希望新名称具有的位数 ( number_ofdigits) 和要重命名的文件扩展名 ( extensions)

通过以下命令运行它:

python3 /path/to/script/rename.py
Run Code Online (Sandbox Code Playgroud)

剧本:

#!/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)
Run Code Online (Sandbox Code Playgroud)

编辑:

下面是稍微改进的版本。它会自动确定目录中最长的名称,并添加前导零直至最长名称的长度。

例子:

1.jpg
12.jpg
123.jpg
Run Code Online (Sandbox Code Playgroud)

变成:

001.jpg
012.jpg
123.jpg
Run Code Online (Sandbox Code Playgroud)

无需设置位数。

#!/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])
Run Code Online (Sandbox Code Playgroud)