LINUX.ORG.RU

Переименование группы файлов по маске

 , ,


1

1

Доброго дня. Есть некоторое количество файлов в названиях которых надо произвести изменения. Некоторые символы заменить, в определённый блок символов, разделённый «_», добавить дополнительный символ. Порылся на форуме и в гугле, нашёл интересную команду rename, но т.к. от программирования далёк не могу понять как именно сделать изменения по маске файла, т.к. все названия однотипные и менять в них тоже нужно одно и тоже. Интересует синтаксис команды и её применение к группе файлов. Спасибо.


emacs + dired/wdired

anonymous
()
  1. Приводи примеры, экстрасенсов тут нет.

  2. Приводи команды, которые ты использовал.

  3. Подходящие инструменты - bash, sed, rename, python, perl, emacs, krename, thunar, nautilus на твой вкус.

anonymous
()
$ ls -1 kotlin-daemon.2021-10-*
kotlin-daemon.2021-10-12.00-22-53-396.00.log
kotlin-daemon.2021-10-12.10-35-13-169.00.log
kotlin-daemon.2021-10-12.22-17-21-764.00.log
kotlin-daemon.2021-10-21.16-19-19-453.00.log
kotlin-daemon.2021-10-21.22-44-02-369.00.log
kotlin-daemon.2021-10-21.22-44-02-369.00.log.lck
$ rename kotlin java kotlin-daemon.2021-10-*   
$ ll java-daemon.2021-10-*                      
java-daemon.2021-10-12.00-22-53-396.00.log
java-daemon.2021-10-12.10-35-13-169.00.log
java-daemon.2021-10-12.22-17-21-764.00.log
java-daemon.2021-10-21.16-19-19-453.00.log
java-daemon.2021-10-21.22-44-02-369.00.log
java-daemon.2021-10-21.22-44-02-369.00.log.lck
urxvt ★★★★★
()
Ответ на: комментарий от anonymous

Прошу прощения, вот примеры для переименования. В файлах помечено что нужно заменить. У меня получается заменить только Y на N и расширение с .log на .bak. Не могу понять как прибавить одну цифру в номер после даты.

123456_UVAO_**Y**_20211019_**001**_00000.**log**  
123456_UVAO_**Y**_20211019_**002**_00000.**log**  
123456_UVAO_**Y**_20211019_**003**_00000.**log**  
123456_UVAO_**Y**_20211019_**003**_00000.**log**

надо переименовать в

123456_UVAO_**N**_20211019_**1**001_00000.**bak**  
123456_UVAO_**N**_20211019_**1**002_00000.**bak**  
123456_UVAO_**N**_20211019_**1**003_00000.**bak**  
123456_UVAO_**N**_20211019_**1**003_00000.**bak**

Дошёл вот до такого rename, дальше продвинуться не могу rename -v -n 'y/Y?log/N?bak/' *.log

ChrisN
() автор топика

Возможно проще или удобнее эту задачу решить через mv,bash,sed. Но там я пока вообще не понимаю в какую сторону копать.

ChrisN
() автор топика
Ответ на: комментарий от ChrisN

Что значит звёздочик в именах файлов? Вобще вам нужно s/// выражение, а не y///. С помощью y/// в только транслируете символы, а не добавляете новые. Не проверял:

s/_Y_(\d+)_([^.]*)\.log/_N_\1_1\2.bak/

mky ★★★★★
()
Ответ на: комментарий от urxvt

Ваш пример взорвёт ТСу мозг, так как в современных дебианах под именем rename находится не бинарник из util-linux, а преловый скрипт (CPAN rename).

mky ★★★★★
()
Ответ на: комментарий от mky

Звёздочки задумывались как выделение жирным, что бы понять что заменить, не учёл что они в коде не работают. Так что просто убираете все звёздочки - это имя файла) Спасибо за ваш вариант, но не сработал.

А есть идеи не через rename?

ChrisN
() автор топика
Ответ на: комментарий от ChrisN

Звёздочки задумывались как выделение жирным

Это усложняет регулярное выражение, так лучше не делать.

foxy_ant ★★
()
Последнее исправление: foxy_ant (всего исправлений: 1)
Ответ на: комментарий от ChrisN

А есть идеи не через rename?

Ну повтори prename на свой лад.

anonymous
()
Ответ на: комментарий от foxy_ant

Это усложняет регулярное выражение, так лучше не делать.

Моя ошибка, не учёл что «**» - выделение жирным не будет работать в рамках «```» - выделения кода. Из-за этого ввёл в заблуждение.

s/_20211019_/_20211019_1/

Это сработало, но почему-то теперь не срабатывает смена расширения файла. s/Y?_20211019_/N_20211019_1/ меняет первые 2 параметра. Сможете доразложить, а то уже ничего понять не могу. Через что можно добавить третий аргумент?

Кстати, а можно ли запустить 2 rename последовательно, друг за другом в одну строку?

ChrisN
() автор топика
Ответ на: комментарий от ChrisN

можно ли запустить 2 rename последовательно, друг за другом в одну строку?

prename 's/../../;s/../../;' *
anonymous
()
Ответ на: комментарий от ChrisN

можно сделать в три прохода: 1. поменять Y на N; 2. добавить символ после даты; 3. поменять расширение с log на bak.

foxy_ant ★★
()
Ответ на: комментарий от anonymous

prename ‘s/../../;s/../../;’ *

Спасибо, спасло.

можно сделать в три прохода: 1. поменять Y на N; 2. добавить символ после даты; 3. поменять расширение с log на bak.

Сделал в 2, но не суть. Главный момент что не обязательно писать всё что нужно в один блок со всеми регулярками.

Всем кто принял участие в решении задачки - огромное спасибо. Моё решение это несколько проходов rename. Видимо плохо гуглил, т.к. такого варианта не находил, а про ; просто не вспомнил, т.к. сижу на win, а *nix только для работы иногда.

ChrisN
() автор топика
Ответ на: комментарий от anonymous

На win эта задача решается через Total Commander за пару минут инструментом «Групповое переименование». Задача была сделать это на *nix :)

ChrisN
() автор топика
Ответ на: комментарий от ChrisN

Спасибо за ваш вариант, но не сработал.

УМВР

123456_UVAO_Y_20211019_001_00000.log -> 123456_UVAO_N_20211019_1001_00000.bak
123456_UVAO_Y_20211019_002_00000.log -> 123456_UVAO_N_20211019_1002_00000.bak
123456_UVAO_Y_20211019_003_00000.log -> 123456_UVAO_N_20211019_1003_00000.bak
123456_UVAO_Y_20211019_004_00000.log -> 123456_UVAO_N_20211019_1004_00000.bak

Какую команду вы запускаете, что пишет?

А есть идеи не через rename?

Там тоже нужно регуляное выражение...

mky ★★★★★
()
Ответ на: комментарий от anonymous

В mc такое есть, переименование, копирование, перенос с заменой по шаблону. Пользуюсь постоянно, довольно удобно, если не слишком заморочное переименование

Sahas ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.