LINUX.ORG.RU
ФорумTalks

Про rename и perl-rename

 ,


0

2

Вот есть утилита rename из состава util-linux. Она не умеет регэкспы. А есть Perl'овый модуль rename, который при установке через make && make install затирает бинарник утилиты из состава util-linux Perl'овым скриптом, который умеет регэкспы.

Маинтейнеры ряда дистрибутивов считают это конфликтом имён, и стараются переименовать этот Perl'овый скрипт. Выносить rename из состава util-linux в отдельный пакет или не включать эту утилиту в основной пакет они и не собираются. В итоге имеем неопределённую работу скриптов, которым нужен вызов rename с регэкспами, в разных дистрибутивах.

В то время как в LFS'е можно просто установить perl-rename и забыть про существование урезанной версии из состава util-linux раз и навсегда. Но, это не решит проблему совместимости с рабочими окружениями других людей.

А какой выход из этой ситуации наиболее правильный на ваш взгляд?

★★★★★

Replaces в debian/control. Ну и аналогично для spec.

Difrex ★★★★ ()

А есть Perl'овый модуль rename, который при установке через make && make install затирает бинарник утилиты из состава util-linux Perl'овым скриптом, который умеет регэкспы.

Ну так не надо использовать make install, и для таких вещей надо надо использовать, например, alternatives (хотя тот ещё crap)

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

для таких вещей надо надо использовать, например, alternatives

Но, это же весьма специфичная вещь. А как же другие дистрибутивы?

Пока что прихожу к выводу, что переименование наиболее универсальный вариант. Только, вот, в разных дистрибутивах может быть переименовано по-разному... Без переименования было бы сразу везде одно и тоже имя, но конфликты файлов (которые не везде просто решаются)...

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

За 15 лет ни разу не пользовался ни тем ни другим. Гикопроблемы

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

Но, это же весьма специфичная вещь. А как же другие дистрибутивы?

В смысле «другие дистрибутивы»? Прикрутить можно куда угодно.

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

В смысле <<другие дистрибутивы>>?

Ну так дистрибутивов же много, и не все они основаны на deb/rpm. Arch, Frugalware, Slackware, Tiny Core Linux, Crux, Sabayon, Void, Vector,... и т.д. И везде свои особенности.

Сам для себя я, конечно, что угодно куда угодно прикручу. Но, от этого мои скрипты у других людей работать не будут. Вот если бы во всех дистрибутивах из коробки было одинаково... А это, по ходу, достигается только общим соглашением о переименовании скрипта. Но, на данный момент тот же Debian идёт против этого вектора, поскольку в нём Perl'овский скрипт просто заменяет rename. А в том же Arch'е Perl'овский скрипт переименовывают в perl-rename.

saahriktu ★★★★★ ()

А какой выход из этой ситуации наиболее правильный на ваш взгляд?

Попросить автора perl-rename поправить make, чтобы он устанавливал rename под другим именем (например /usr/bin/perl-rename), а /usr/bin/rename делал симлинком на это имя, причем создание симлинка должно быть отключаемым. По дефолту симлинк можно оставить. Имя пусть выберет автор, чтобы оно было в апстриме и было у всех одинаковое. В дистрах можно отключать установку симлинка, или предоставить выбор юзеру, если в дистре для этого есть средства, как в генте.

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

В итоге имеем неопределённую работу скриптов, которым нужен вызов rename с регэкспами, в разных дистрибутивах.

Если твоим скриптам нужны регулярки в rename, то лучшее, что ты можешь сделать — переписать их на том же perl с применением модуля rename.

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

Arch, Frugalware, Slackware, Tiny Core Linux, Crux, Sabayon, Void, Vector

Что это за странные непонятные слова и зачем они не нужны?

А какой выход из этой ситуации

Нет никакой ситуации, кому нужен perl-rename, тот сам знает, как его установить/запустить, остальным задумываться об этом не нужно.

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

Что это за странные непонятные слова и зачем они не нужны?

Это названия дистрибутивов

остальным задумываться об этом не нужно

Бывают ситуации когда скриптам нужно переименовывать файлы пучками.

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

Бывают ситуации когда скриптам нужно переименовывать файлы пучками

За 20 лет общения с линуксом я ни разу не использовал rename/prename в скриптах, только в шелле. В тех крайне немногих случаях, когда именно требовалось массовое переименование скриптами, я делал это на перле. И это не было переименованием по регэкспам. Можно хоть один пример хоть как-то относящийся к реальности, а не «если бы ногти на ногах были на 0.5мм длиннее, то чесать левой ногой за правым ухом было бы на 1% удобнее».

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

Я могу даже целые категории таких случаев описать: исправление расширений (особенно для приведения к единообразию в тех случаях, когда дальше скрипт обрабатывает файлы с конкретным расширением), устранение из имён файлов пробелов и ряда других символов, на которых скрипт может спотыкаться,... и т.д.

Типичные примеры:

rename 's/\.djv$/\.djvu/' *.djv
rename 's/\ /_/g;s/\(/_/g;s/\)/_/g' *

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

исправление расширений (особенно для приведения к единообразию в тех случаях, когда дальше скрипт обрабатывает файлы с конкретным расширением)

Во-первых, find . -name '*.djv' -type f -exec mv '{}' '{}'u \;. Во-вторых, для определения типа содержимого в скриптах в частности и машинным способом вообще предназначен MIME-тип или, на худой конец, вывод команды file.

устранение из имён файлов пробелов и ряда других символов, на которых скрипт может спотыкаться

Если твой скрипт спотыкается на пробелах в именах, то надо не файлы переименовывать, а скрипт чинить.

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

исправление расширений

Операция разовая, скрипта не требует, perl-rename не требует (ну нахрена писать столько непонятных закорючек, когда rename .djv .djvu *.djv банально короче и понятнее).

в тех случаях, когда дальше скрипт обрабатывает файлы с конкретным расширением

Если скрипт на баше (хотя я пришёл к выводу, что писать скрипты на баше смысла уже нет, на дворе почти 2017, перл давно везде есть и на нём в разы удобнее и быстрее, если не нравится перл, то есть питон/руби/своёлюбимое, хотя тут портабельность несколько меньше, не 100% машин оснащены питоном, а жалкие 99.99999999999999%), то тут и rename лишний, ${myvar/.djv/.djvu} рулит.

устранение из имён файлов пробелов и ряда других символов, на которых скрипт может спотыкаться

Чини скрипт, не должен он в 2016 на таком спотыкаться, это не повод корёжить имена в нечитаемый вид.

redgremlin ★★★★★ ()

В итоге имеем неопределённую работу скриптов, которым нужен вызов rename с регэкспами, в разных дистрибутивах.

Если это скрипты тоже на perl, то НЕ использовать соответствующий модуль - моветон.

Если скрипты на чем-то другом, я бы впилил тест, который бы проверял какой rename используется. Если это урезанный - ищем perl-rename.

З.Ы. Вспоминается проверка в bash скриптах на ОС, когда какой-то идиот сменил $OSTYPE с linux на linux-gnu. В итоге скрипт плевался на неподдерживаемую ОС. Вау. Нормально загуглить это изменение, кстати, так и не удалось.

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

За 20 лет общения с линуксом я ни разу не использовал rename/prename в скриптах, только в шелле.

Это ничего не значит, кроме «мне не надо, значит никому не надо». Самомнение гипертрофированное? Царь, я не узнал вас в гриме.

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

Ну, ТС вменяемого юзкейса не предложил, может ты тогда предложишь?

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

Я в пятницу туповат и нихрена не понял, что ты хотел сказать. Будем считать, что ты тоже не можешь придумать ни одного варианта, когда rename надо вызывать в скриптах. Печалька.

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

ну епта, когда надо переименовать скопом и ничего не делать с индвидуальными файлами, тогда и вызывать (p)rename. Например директория куда бросаются массово файлы с «некрасивыми» именами и т.д.

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

ну епта, когда надо переименовать скопом и ничего не делать с индвидуальными файлами, тогда и вызывать (p)rename

Ну, я именно так всегда и делаю. Ещё раз, вопрос не в том, зачем нужен

rename, а зачем его вызывать в скриптах.

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

а зачем его вызывать в скриптах.

чтобы переименовывать из скрипта

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

чтобы переименовывать из скрипта

И вот я уже второй день прошу, чтобы мне привели пример, когда это хоть сколь-нибудь целесообразно и оправдано. Сам я такого примера придумать не могу, всегда получается, что либо rename там лишний, либо скрипт.

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

Вы просто исходите из предпосылки, что юзеру эти файлы архиважны, и именно с этими именами. Но, это могут быть промежуточные файлы. А даже если это и не промежуточные, то может быть разный подход к именам файлов. На мой взгляд всё, что за рамками [a-zA-Z0-9] и '.', в именах файлов, как правило, просто лишнее. Нет этих лишних символов - нет и проблем. Поэтому мне интереснее приводить имена файлов к правильному виду чем разбирать вопросы экранирования имён файлов. И, да, «приводить имена файлов к правильному виду» в моём понимании включает и пользование вот этим скриптом:

> cat ./8bitname
#!/bin/bash
NEWFNAME=`echo "$1" | iconv -c -f utf-8 -t koi8-r`
if [ "$1" != "$NEWFNAME" ]; then
mv -i "$1" "$NEWFNAME"
fi
А также инструментами транслитерации имён файлов.

saahriktu ★★★★★ ()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от redgremlin
#!/bin/sh

TIMEFORMAT='......'

if cd /path/to/files/$(date "+%$TIMEFORMAT"); then
   ...
   prename '...REGEXP...HERE...' *.$EXT
   ...
fi
futurama ★★★★ ()
Ответ на: комментарий от saahriktu

На мой взгляд

ТВОЙ взгляд может заинтересовать разве что твоего лечащего врача.

Поэтому мне интереснее приводить имена файлов к правильному виду чем разбирать вопросы экранирования имён файлов

«Больной ублюдок» ©

iconv -c -f utf-8 -t koi8-r

И зачем тебе файл с именем «iconv: недопустимая входная последовательность в позиции хххх»?

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

Всё равно ничерта не понял. Что за файлы, как они там оказались, зачем их надо переименовывать и почему для этого обязательно нужны регэкспы.

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