Подскажите, пожалуйста, как переименовать все файлы в директории, увеличив часть названия файлов на единицу.
Пример:
aa006793.txt - > aa006893.txt
ad100143.txt -> ad100243.txt
Массовое переименование(bash)
Модераторы: /dev/random, Модераторы разделов
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование(bash)
Например, при помощи prename.
Но сначала неплохо бы понять, представляет ли собой имя файла шестнадцатеричное число, или две буквы + 6 десятеричных цифр? Во втором случае что должно происходить, например, с файлом вида aa999999.txt?
Но сначала неплохо бы понять, представляет ли собой имя файла шестнадцатеричное число, или две буквы + 6 десятеричных цифр? Во втором случае что должно происходить, например, с файлом вида aa999999.txt?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
- Hephaestus
- Сообщения: 3729
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
- Контактная информация:
Re: Массовое переименование(bash)
Bizdelnick, судя по приведенным ТС примерам,
имя файла составлено как префикс+4-значный номер (именно его увеличиваем)+суффикс, так что всё несколько сложнее.
Я так понимаю, что надо парсить имя, разделяя его на префикс, номер, суффикс, потом увеличивать номер и снова составлять имя префикс+новый номер+суффикс. Но это получится, только если префиксы/суффиксы однотипны.
Если же нет... тады ой.
имя файла составлено как префикс+4-значный номер (именно его увеличиваем)+суффикс, так что всё несколько сложнее.
Я так понимаю, что надо парсить имя, разделяя его на префикс, номер, суффикс, потом увеличивать номер и снова составлять имя префикс+новый номер+суффикс. Но это получится, только если префиксы/суффиксы однотипны.
Если же нет... тады ой.
Re: Массовое переименование(bash)
Код: Выделить всё
# 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
Спасибо сказали:
Re: Массовое переименование(bash)
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
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование(bash)
Hephaestus писал(а): ↑20.09.2015 12:44имя файла составлено как префикс+4-значный номер (именно его увеличиваем)+суффикс, так что всё несколько сложнее.
Я так понимаю, что надо парсить имя, разделяя его на префикс, номер, суффикс, потом увеличивать номер и снова составлять имя префикс+новый номер+суффикс. Но это получится, только если префиксы/суффиксы однотипны.
Две версии есть. У меня и побольше найдётся, но всё-таки хотелось не гадать, а узнать всё непосредственно от ТСа.
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.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование(bash)
Спасибо всем большое за ответы. Я разобрался со своим вопросом.
Re: Массовое переименование(bash)
Возможно поможет команда tr ?