如何在文件名中以前导零递增数字

时间:2018-08-05 18:16:14

标签: python bash batch-rename

我有一组文件,不一定具有相同的扩展名。这些文件是由Python脚本创建的,该脚本对某些文件(例如x.jpg,y.jpg和z.jpg)进行迭代,然后使用零填充对其进行编号,以使这些数字的长度为7个字符(在此示例中) ,文件名分别为0000001 - x.jpg0000002 - y.jpg0000003 - z.jpg)。

我现在需要一个脚本(任何语言都可以,但是Bash / zsh是首选),它将通过一个参数增加这些数字。从而重命名目录中的所有文件。例如,我想调用该程序为(假设使用Shell脚本):

./rename.sh 5

最终文件名中的数字应填充为长度7,并确保最初没有文件号为9999999。因此,结果文件应为0000006 - x.jpg0000007.jpg,{{1 }}。确保最初所有文件都是增量文件;也就是说,数字之间没有差距。

在Bash中,我似乎根本不容易做到这一点,即使在Python中,这似乎也很繁琐。最好的方法是什么?

编辑:好的,到目前为止,这是我的努力。我认为前导0是个问题,因此我使用重命名将其删除:

0000008.jpg

现在只剩下数字了,理想情况下,我会使用一个类似这样的循环,但是我对语法以及为什么这是错误的并不十分熟悉:

rename 's/^0*//' *

5只是硬编码,但我想将其更改为第一个参数应该没什么大不了的。然后,我可以使用另一个循环将0加回来。

1 个答案:

答案 0 :(得分:0)

import sys, glob, re, os
# Get the offset at the first command-line argument
offset = int(sys.argv[1]) 

# Go through the list of files in the reverse order
for name in reversed(glob.glob('*.jpg')):
    # Extract the number and the rest of the name
    i, rest = re.findall("^(\d+)(.+)", name)[0]
    # Construct the new file name
    new_name = "{:07d}{}".format(int(i) + offset, rest)
    # Rename
    os.rename(name, new_name)