LINUX.ORG.RU

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


0

2

Всем отозвавшимся доброго времени суток!

Использую fedora 16. У меня стоит следующая проблема: до тех пор, пока не научусь работать со скриптами, нужно постоянно переименовывать группы текстовых файлов по схеме: o11.<3-значный номер> --> o11.<3-значный номер>.dt. Т.е., по сути, мне нужно в конце каждого файла добавлять '.dt', причём автоматически, а не вызывая rename кучу раз с разными аргументами.

Ман по команде rename мне не помог, я не смог полностью разобраться с принципом работы команды.

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

Заранее спасибо!



Последнее исправление: wswgG (всего исправлений: 1)

Чтобы не заморачиваться со скриптами, попробуйте более наглядный путь:

1) sudo yum install mc
2) mc
3) перейдите в каталог, где нужно переименовать файлы. Отметьте необходимые файлы клавишей Insert (или нажмите * для отметки всех файлов).
4) нажмите F6
5) наберите \1.dt
6) нажмите enter

Slavaz ★★★★★
()
 rename 's/$/.dt/' o11.* 

вкратце, меняешь (s/) конец строки(обозначается символом $) на ".dt" для всех файлов подходящих под маску o11.* («*» - любое количество любых символов, можно ещё уточнить регексп при необходимости)

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

кстати, в дебиянах тот который из util-linux называется rename.ul и даже не предлагается альтернативой для системного rename.

И правильно

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

всех файлов подходящих под маску o11.*

угу, а всем ранее измененным файлам допишется еще один суффикс :)

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

угу, а всем ранее измененным файлам допишется еще один суффикс :)

будем считать, что уже измененных там нет

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

будем считать, что уже измененных там нет

это ты ТС'у доказывай :)

anonymous
()
for i in o11.[0-9][0-9][0-9]; do mv $i $i.dt; done

Какой нафиг rename? О чём вы?

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

ЗдОрово! Способ работает! Не знал, что из mc это можно сделать. Спасибо! Особенно посмешила такая подробность изложения - прямо как на блондинку написали, хм-хм-хм!..

Есть пара комментариев: 1. Какова роль «\1» в маске имени файла? Где можно прочесть всю инфу по данной теме? Укажите источник, пожалуйста, желательно, книгу на русском языке. 2. Хотелось бы уметь обходиться без mc. Какую команду в терминале надо ввести?

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

Я не спец по данной теме...

Предположим, что меня в папке интересует только группа файлов с именами вида o11.???, тогда как ещё есть файлы с именами o11.???.log и другими окончаниями.

Команда для переименования только интересующих меня файлов должна быть такой : rename 's/$/.dt/' o11.0?? ...???...

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

Простите, ещё один вопрос: а как выполнить в таком случае обратное действие? Т.е. есть группа файлов с именами o11.???.dt, а мне нужно получить группу o11.??? - как это сделать? Допустим в mc.

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

Как я и попробовал уже - подобные варианты не работают...

- ни $ rename 's/$/.dt$/' o11.0*

- ни $ rename 's/$/.dt/' o11.0*

- ни $ rename 's/$/.dt$/' o11.0??

- ни $ rename 's/$/.dt/' o11.0??

даже если перед '.' ставлю \... Блеять!!!

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

хинт - первым параметром (в кавычках) обычное perl выражение

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

Да посмотрел я! Не работает эта команда. Может, у меня какая-то нужная часть перловки не установлена?

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

Может, у меня какая-то нужная часть перловки не установлена?

попробуй вместо rename prename, я не знаю как в этих ваших федорах оно называется

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

В fedora нет команды prename, есть только rename.

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

Особенно посмешила такая подробность изложения - прямо как на блондинку написали, хм-хм-хм!..

Это привычка, чтобы потом было меньше вопросов

Есть пара комментариев: 1. Какова роль «\1» в маске имени файла?

подставляет найденное. Как бы это сказать...
В общем, если в mc в качестве «исходного шаблона» установлена «*», то имена файлов целиком автоматически считаются «найденным».

Где можно прочесть всю инфу по данной теме? Укажите источник, пожалуйста, желательно, книгу на русском языке.

man mc

2. Хотелось бы уметь обходиться без mc. Какую команду в терминале надо ввести?

гм. В данном случае используются GLOB-выражения. В консоли таких расширенных не будет, как в mc, там больше regex-выражения в почёте. Про использование регулярных выражений в консоли ищите по ключевому слову REGEX.

Простите, ещё один вопрос: а как выполнить в таком случае обратное действие? Т.е. есть группа файлов с именами o11.???.dt, а мне нужно получить группу o11.??? - как это сделать? Допустим в mc.


Копировать эти файлы (XXX шт.) с исходным шаблоном:
*.dt
в:
\1

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

Где можно прочесть всю инфу по данной теме? Укажите источник, пожалуйста, желательно, книгу на русском языке.

man mc

конкретизирую:

/Маски файлов для операций копирования/переименования

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

За помощь по mc благодарю - работает надёжно.

Но про ту же самую операцию через ком.строку я понял мало, к сожалению. Т.е. надо почитать маны к командам regexp и regsub - я правильно понял? И ещё такой вопрос: варианты, предложенные другими участниками дискуссии, типа:

rename 's/$/.dt/ unless /dt$/' o11.*

- не работают, какая всё же тому причина?

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

в Федорке rename не понимает регекспов. Вероятно, регекспы понимает другой rename, основанный на перле, а не из linux-utils.

попробуйте так:

sudo yum -y install mmv
mmv '*' '#1.dt'
и обратный процесс:
sudo yum -y install mmv
mmv '*.dt' '#1'

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

Гм.

Для запуска mmv не требуется учётная запись рута...к слову.

Предложенный вариант, не смотря на свою работоспособность, не приемлем в случае, когда мне нужно не всем файлам в папке сзади дописать '.dt', а только подходящим под определённый шаблон. Например, есть файлы o11.0??, есть o11.0??.log и ещё скрипты o11.0??.crun. Я хочу переименовать только o11.0??, но команда

mmv '*' '#1.dt'

переименует все файлы, а символ ? игнорируется при попытке написать название группы имён файлов в виде 'o11.0??'. Что делать?

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

И ещё: получается, что работая на удалённой машине (на кластере, например) я буду вынужден либо надеяться на то, что mmv или mc там установлены, да? Иначе меня ждёт копирование на тот комп, где есть одна из этих утилит, обработка и копирование обратно, верно?

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

Для запуска mmv не требуется учётная запись рута...к слову.

Да, не требуется. Я и не приводил примеров, в которых для запуска mmv нужен рут.

переименует все файлы, а символ ? игнорируется при попытке написать название группы имён файлов в виде 'o11.0??'. Что делать?

[code]
mmv 'o11.0*' 'o11.0#1.dt'
[/code]

И ещё: получается, что работая на удалённой машине (на кластере, например) я буду вынужден либо надеяться на то, что mmv или mc там установлены, да?

да. Без этих утилит массовое переименовывание выглядит примерно так:
[code]
for file in 'o11.0*'; do mv «${file}» «${file}».dt; done
[/code]

и обратная операция:
[code]
for file in 'o11.0*.dt'; do mv «${file}» «$(echo ${file}| sed 's/\.dt$//')»; done
[/code]

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