BASH: цикл для файлов с ведущими нулями или без них

Я не хочу переименовывать (или обрабатывать) файлы в каталоге (с определенным расширением). Имена файлов могут быть любыми, содержащими порядковые номера, например

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..и т. д.?

Спасибо.


person IJK    schedule 11.04.2013    source источник
comment
Как сделать так, чтобы цикл также понимал порядок файлов с нумерацией файлов без начальных нулей 1,2..10,11..и т. д.? Ошибка синтаксического анализа. Можете ли вы перефразировать или привести конкретный пример, какими должны быть имена файлов?   -  person Jens    schedule 11.04.2013
comment
Какой соответствующий номер в 78aa1bbb.txt? 78 или 1?   -  person Jens    schedule 11.04.2013


Ответы (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
person michaelmeyer    schedule 11.04.2013