Массовое переименование(bash)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

DeanD
Сообщения: 8

Массовое переименование(bash)

Сообщение DeanD » 20.09.2015 08:17

Подскажите, пожалуйста, как переименовать все файлы в директории, увеличив часть названия файлов на единицу.

Пример:

aa006793.txt - > aa006893.txt
ad100143.txt -> ad100243.txt
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15750
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Массовое переименование(bash)

Сообщение Bizdelnick » 20.09.2015 12:29

Например, при помощи prename.
Но сначала неплохо бы понять, представляет ли собой имя файла шестнадцатеричное число, или две буквы + 6 десятеричных цифр? Во втором случае что должно происходить, например, с файлом вида aa999999.txt?
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2573
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Массовое переименование(bash)

Сообщение Hephaestus » 20.09.2015 12:44

Bizdelnick, судя по приведенным ТС примерам,
имя файла составлено как префикс+4-значный номер (именно его увеличиваем)+суффикс, так что всё несколько сложнее.
Я так понимаю, что надо парсить имя, разделяя его на префикс, номер, суффикс, потом увеличивать номер и снова составлять имя префикс+новый номер+суффикс. Но это получится, только если префиксы/суффиксы однотипны.
Если же нет... тады ой.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Массовое переименование(bash)

Сообщение nerve » 20.09.2015 13:11

Код: Выделить всё

# ls 1111
aa006793.txt  ad100143.txt
# ./script.sh 1111
# ls 1111
aa006893.txt  ad100243.txt
# cat script.sh
#!/bin/bash
DIR=$1
for f in `ls -1 $DIR`
do
part1=`echo "$f" | cut -c 1-5`
part2=`echo "$f" | cut -c 6`
newpart2=`expr "$part2" + 1`
part3=`echo "$f" | cut -c 7-12`
newname="${part1}${newpart2}${part3}"
mv $DIR/"$f" $DIR/"$newname"
done

Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Массовое переименование(bash)

Сообщение nerve » 20.09.2015 13:18

Bizdelnick писал(а):
20.09.2015 12:29
Например, при помощи prename.
что должно происходить, например, с файлом вида aa999999.txt?

следуя арифметической логике увеличения на единицу, 9 должно превращаться в 10
то есть aa999999.txt -> aa9991099.txt
если же 9 должно переходить в 0, тогда надо отдельно это оговаривать, ну и скрипт разумеется должен не плюсовать единичку к 9, а переводить ее в 0, что в принципе не сложно сделать добавив проверку.
но это уже тс-у решать.

Код: Выделить всё

# ls 1111
aa006893.txt  ad100243.txt
# ./script.sh 1111
# ls 1111
aa006993.txt  ad100343.txt
# ./script.sh 1111
# ls 1111
aa006093.txt  ad100443.txt
# cat script.sh
#!/bin/bash
DIR=$1
for f in `ls -1 $DIR`
do
part1=`echo "$f" | cut -c 1-5`
part2=`echo "$f" | cut -c 6`
if [ "$part2" = "9" ]; then
newpart2="0"
else
newpart2=`expr "$part2" + 1`
fi
part3=`echo "$f" | cut -c 7-12`
newname="${part1}${newpart2}${part3}"
mv $DIR/"$f" $DIR/"$newname"
done
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15750
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Массовое переименование(bash)

Сообщение Bizdelnick » 20.09.2015 15:49

Hephaestus писал(а):
20.09.2015 12:44
имя файла составлено как префикс+4-значный номер (именно его увеличиваем)+суффикс, так что всё несколько сложнее.
Я так понимаю, что надо парсить имя, разделяя его на префикс, номер, суффикс, потом увеличивать номер и снова составлять имя префикс+новый номер+суффикс. Но это получится, только если префиксы/суффиксы однотипны.
nerve писал(а):
20.09.2015 13:18
следуя арифметической логике увеличения на единицу, 9 должно превращаться в 10
то есть aa999999.txt -> aa9991099.txt

Две версии есть. У меня и побольше найдётся, но всё-таки хотелось не гадать, а узнать всё непосредственно от ТСа.

nerve писал(а):
20.09.2015 13:11

Код: Выделить всё

#!/bin/bash
DIR=$1
for f in `ls -1 $DIR`
do
part1=`echo "$f" | cut -c 1-5`
part2=`echo "$f" | cut -c 6`
newpart2=`expr "$part2" + 1`
part3=`echo "$f" | cut -c 7-12`
newname="${part1}${newpart2}${part3}"
mv $DIR/"$f" $DIR/"$newname"
done

А если файл с таким именем уже существует? Если бы не этот нюанс, всё это многобуквие можно было бы заменить на что-то вроде prename 's/(\D*)(\d+).txt/$1 . sprintf("%06d", $2 + 100) . ".txt"/e' *.txt.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

DeanD
Сообщения: 8

Re: Массовое переименование(bash)

Сообщение DeanD » 20.09.2015 16:22

Спасибо всем большое за ответы. Я разобрался со своим вопросом.
Спасибо сказали:

enotik
Сообщения: 1

Re: Массовое переименование(bash)

Сообщение enotik » 20.09.2015 16:50

Возможно поможет команда tr ?
Спасибо сказали: