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

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

Модераторы: /dev/random, Модераторы разделов

Ответить
DeanD
Сообщения: 8

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

Сообщение DeanD »

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

Пример:

aa006793.txt - > aa006893.txt
ad100143.txt -> ad100243.txt
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

Например, при помощи prename.
Но сначала неплохо бы понять, представляет ли собой имя файла шестнадцатеричное число, или две буквы + 6 десятеричных цифр? Во втором случае что должно происходить, например, с файлом вида aa999999.txt?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

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

Сообщение Hephaestus »

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

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

Сообщение nerve »

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

# 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
Сообщения: 280
ОС: OpenBSD

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

Сообщение nerve »

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
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

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 »

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

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

Сообщение enotik »

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