Назад | Перейти на главную страницу

Переименование файлов - требуется регулярное выражение

У меня 640 файлов в следующем виде

string02_01.ext, string02_02.ext, string02_03.ext  ...

Мне нужно переименовать их все, чтобы каждые 40 элементов меняли шаблон, например

first  40s: a0b0c0.ext, a1b0c0.ext, a2b0c0.ext ...
second 40s: a0b1c0.ext, a1b1c0.ext, a2b1c0.ext ...
third  40s: a0b2c0.ext, a1b2c0.ext, a2b2c0.ext ...
fourth 40s: a0b3c0.ext, a1b3c0.ext, a2b3c0.ext ...

Что было бы хорошим способом сделать это? Любые идеи будут оценены.

заранее спасибо

Я ожидаю, что так будут организованы ваши 640 имен файлов,

Row  1: a0b0c0.ext a1b0c0.ext ... a39b0c0.ext
Row  2: a0b1c0.ext a1b1c0.ext ... a39b1c0.ext
...
Row 16: a0b15c0.ext a1b15c0.ext ... a39b15c0.ext

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

cd /directory/containint/the/files
find . -name string02_*.ext > files.lst
# maybe you'll run a 'sort' pipe to get files.lst ordered as you want.

Обратите внимание, что ваши 640 файлов не могут иметь форму string02_nn.ext,
Тогда они, вероятно, будут `string02_nnn.ext ....
не имеет значения, поскольку мы используем указанную выше схему.


Скрипт bash для переименования должен выглядеть так:

#!/bin/bash
i=0;
j=0;
k=0;

for f in $(<files.lst)
do
    mv $f a${k}b${j}c0.ext # rename happens here
    if (( $i % 40 == 0 )); then
            j=$(($j + 1));
            k=0;
    else
            k=$(($k + 1));
    fi
    i=$(($i + 1));
done

Для этого вам не нужно регулярное выражение, вам нужен обычный сценарий оболочки, который выполняет итерацию по файлам по мере необходимости. Предполагая, что вы хотите, чтобы этот 40-й файл был назван a39b0c0.ext, что-то вроде этого сценария оболочки должно помочь:

a=0
b=0
c=0
for f in string02_*.ext; do    # Assuming that you're running this in the directory with the files
    if [ "$a" = "40" ]; then
        a=0
        b=$(($b + 1))
    fi
    if [ "$b" = "40" ]; then
        b=0
        c=$(($c + 1))
    fi
    mv $f a${a}b${b}c${c}.ext
    a=$(($a + 1))
done

не уверен, что это точное соответствие вашим потребностям, но взгляните на mmv. он может выполнять массовые переименования, например:

file1.txt
file2.txt
file3.txt

mmv "file*.txt" "#1_file.txt"

1_file.txt
2_file.txt
3_file.txt

если вы используете дистрибутив, подобный Debian, просто apt-get mmv.