BASH:循环包含或不包含前导零的文件

时间:2013-04-11 09:30:24

标签: file shell loops rename zero

我不想重命名(或处理)目录中的文件(具有特定扩展名)。 文件名可以是包含订购号的任何内容,例如

1.aaa.txt
aa 1.txt
aa01bb.txt
78aa1bbb.txt
78aa2bbb.txt

使用或不使用前导零和新文件名进行编号。

所以我有:

NUM=0; for f in *.txt; do NUM=`expr $NUM + 1`; mv "$f" "yyy_$NUM.txt"; done

如何使循环也理解文件顺序,文件编号不带前导零1,2..10,11..etc。?

感谢。

1 个答案:

答案 0 :(得分:1)

以下Python代码应该执行订购:

import re
from glob import glob

files = sorted([ file[:-4] for file in glob('*.txt') ])

chunked = []

for i, file in enumerate(files):
    chunks = re.split('(\d+)', file)
    for j, chunk in enumerate(chunks):
        if chunk.isdigit():
            chunks[j] = int(chunk)
    chunked.append((chunks, i))

for chunk, i in sorted(chunked):
    print(files[i])

这是一个看起来像这样的目录:

$ ls
01aa.txt  21a.txt  aa01bb.txt   aa10bb.txt
21aa.txt  2aa.txt  aa023bb.txt  aa1bb.txt

输出:

01aa.txt
2aa.txt
21a.txt
21aa.txt
aa01bb.txt
aa1bb.txt
aa10bb.txt
aa023bb.txt

这与简单sort的输出不同。

$ ls | sort
01aa.txt
21aa.txt
21a.txt
2aa.txt
aa01bb.txt
aa023bb.txt
aa10bb.txt
aa1bb.txt