LINUX.ORG.RU

Perl rename: Действительно всё так плохо?

 , , ,


0

1

Всегда заочно с большой теплотой и нежностью относился к Пёрдл Perl. Импонирует и ориентированность на работу с текстом, и предоставление свободы писать максимально кратко. (Однострочники наше всё.) Даже читал какое-то там «философское» эссе кого-то из создателей, там ещё было про magicians (название не помню).

И вот значится решил я: а фигли переименовывать файлы Bash’ем, если есть он, великий Perl, с его регулярными выражениями, ставшими стандартом де-факто.

И вот я читаю значится: https://unix.stackexchange.com/q/730894

И тихо охереваю.

Вопрос так сказать к знатокам (sudo -iddqd -- @perl5_guy). Как вот этим пользоваться, не забивая голову всей этой дребеденью? Целевая операционная система, если чё, Макос.



Последнее исправление: jsx_ (всего исправлений: 2)
Ответ на: комментарий от shell-script
  • Не ясно, установлен ли на macOS «нормальный» Perl или «ненормальный» (иначе зачем автор ответа советует ставить его вручную).

  • Не ясно, что делать с этим:

There’s another binary tool with the same name used on some distro. Depending on your distro, the Perl version can be called perl-rename, file-rename, prename, pname or rename. There’s also a Python rename command out there!

  • И вот с этим:

    • on macOS, the Homebrew packages rename and util-linux conflict

    • on macOS, the Homebrew package rename offers a Perl script that looks different from the others

  • И вот с этой частью в таблице:

    Table of default versions VS distros of rename command

    Perl (old)Perl (new)Perl (other?)C
    macOS (Homebrew)N/AN/Arename (pkg rename)rename (pkg util-linux)
jsx_
() автор топика
Ответ на: комментарий от dmitry237

Я не против разбираться в языке. Мне не нравится идея разбираться в свалке (а это выглядит именно как свалка), состоящей из нужного мне инструмента, его каких-то «левых» версий и вообще других инструментов, просто названнах точно так же.

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

А что тут разбираться? По твоей собственной ссылке есть таблица. Для мака в ней ясно, что тебе нужен пакет rename и не нужен пакет util-linux.

В остальном… Фиг знает, это уже вопрос явно не по теме форума. Нужен какой-нибудь mac.org.ru ;)

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

Так по перлу-то какие вопросы непонятны? То, что в макоси используются левые утилиты и у них NIH-синдром - давно известно. Но это проблемы макоси, а не перла. А так у автора чётко и понятно на примерах показано, как использовать написанную на perl утилиту rename и даны указания, где искать документацию.

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

Ты всё правильно написал. Меня бомбануло в целом от ситуации, я это в общем с самого начала понимал. Но сформулировал именно так, как сформулировал. Хотел получить какой-то совет как в Макоси этим пользоваться, не загружая голову лишним. Вроде чё-то народ понаписал, попозже потестирую.

jsx_
() автор топика
Ответ на: комментарий от shell-script

А вообще вот, если я типа хочу учиться быть разработчиком под Макось, какуя связка более актуальна: GNUшные утилиты + Bash, BSDшные + Zsh, или ещё как-то? Понятно что это не первоочередной вопрос, важнее Swift и API учить, но тем не менее.

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

какуя связка более актуальна: GNUшные утилиты + Bash, BSDшные + Zsh, или ещё как-то?

Нет никаких «связок», всё сочетаемо в любых пропорциях. Что больше нравится, тем и пользуешься.

Есть, конечно, отдельные нюансы. Например, в iTerm 2 есть интеграция с tmux, но не с screen (или раньше не было, давно не слежу). Но это не какое глобальное «BSD vs GNU», а заморочки, касающиеся этих трёх программ и ничего более.

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

А были времена, когда в макоси perl, python и ruby шли предустановленными из коробки. Да, не очень свежие версии, но всё же.

Python и сейчас идёт, причем очень даже свежей версии

skyman ★★★★
()

Тоже столкнулся с этой странной утилитой когда искал шелл-обёртку над rename(2). И вот думал это прога для того чтоб переименовать файл, а там внутри какая-то перл-портянка мутного назначения. Как оказалось, вызов rename(2) из шелла штатно не предусмотрен ни в линуксе (ну это ещё ладно, тут часто что-то странное), ни даже в фрибсд. Пришлось эту прогу из 10 строк писать самому. mv, если что, для этой цели не подходит, потому что он слишком умный и начинает какие-то кастомные действия, если видит симлинк или директорию в месте назначения.

А перл не нужен.

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

Вот хороший совет. В этом модуле есть move, он стандартный. Использовать File::Copy рекомендует так же справка perldoc -f rename.

For a platform independent «move» function look at the File::Copy module.

Можно сформировать список файлов Perl’ом, а дальше сделать | xargs -n 2 mv.

Забавно, что про существование rename я вообще из этого треда узнал. Никогда не использовал.

P.S. В perl’е есть портабельные версии популярных Unix команд: perl -MExtUtils::Command -e cat foo bar

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

тянет за собой целый ненужный интерпретатор

Который есть почти в любой unix-like системе из коробки.

Ну и пользоваться ей, не потратив полчаса на чтение описания, невозможно.

    rename OLDNAME,NEWNAME
            Changes the name of a file; an existing file NEWNAME will be
            clobbered. Returns true for success; on failure returns false
            and sets $!.

            Behavior of this function varies wildly depending on your system
            implementation. For example, it will usually not work across
            file system boundaries, even though the system *mv* command
            sometimes compensates for this. Other restrictions include
            whether it works on directories, open files, or pre-existing
            files. Check perlport and either the rename(2) manpage or
            equivalent system documentation for details.

            For a platform independent "move" function look at the
            File::Copy module.

            Portability issues: "rename" in perlport.

Что здесь читать полчаса?

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

Который есть почти в любой unix-like системе из коробки.

Вовсе нет. Даже в линуксах не во всех. В фрибсд его в базовой системе нет и это хорошо. Как и питона.

Что здесь читать полчаса?

Во-первых, даже чтоб найти эту страницу, надо долго листать мануал. Во-вторых, из неё совершенно непонятно, как она себя ведёт если например в имени файла запятая, можно её туда как-то подсунуть или нет, и если можно - значит есть ещё какое-то экранирование со своим отдельным синтаксисом, которое тоже может тебе всё запороть если ты его не учтёшь. А что если имя файла начинается с дефиса? Оно всё ещё будет именем или это окажется какая-то опция? Ведь он же умеет принимать опции.

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

Забавно, что про существование rename я вообще из этого треда узнал. Никогда не использовал.



я вообще не въехал, что за каша в посте
чел пользуется какой-то левой утилитой, которая, по-совпадению, написана на перл, и ругает сам перл
о чём тут вообще

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

Во-первых, даже чтоб найти эту страницу, надо долго листать мануал.

Зачем??? perldoc -f rename

Ведь он же умеет принимать опции.

А тут я уже в непонятках. Мы про функцию rename говорим или про программу rename?

UPD: признаю свою ошибку, я в комментарии выше под «перловым rename’ом» имел в виду встроенную функцию, коитторую можно юзать в т.ч. в однострочниках, но не написал это явно.

А утилита rename высокоуровневая даже по сравнению с mv, и никак к сисколлу не относится.

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

Я за бан. И ты не правильно понимаешь суть однострочников в perl: правильные однострочники perl внешне мало отличаются от однострочников на brainfuck, поэтому питон и вытеснил перл.

Shadow ★★★★★
()

Парни, это я.

Кто-то может объяснить, как вот этот скрипт из интернетов заставить работать?

#!/usr/bin/perl

# randomize the filenames for the photo frame
# https://www.bulkrenameutility.co.uk/forum/viewtopic.php?t=114

$dir = $ARGV[0] || die "directory?\n";
chdir($dir) || die "chdir";

opendir(D, ".") || die "opendir";
@files = grep {/jpg/} readdir(D);
closedir(D);

# array shuffle from perl FAQ
srand;
@newfiles = ();
for (@files) {
    my $r = rand @newfiles + 1;
    push(@newfiles,$newfiles[$r]);
    $newfiles[$r] = $_;
}

if ($#files != $#newfiles) { die "$#files != $#newfiles\n"; }

while ($old = pop @files) {
    $new = pop @newfiles;
    $new =~ s/^p/r/;
    ! -f $new || die "won't overwrite $new - check the regexp\n";
    print "$old -> $new\n";
    rename $old, $new || warn "rename $old -> $new: $!\n";
}

Если запускаю как foo.pl ./, появляется такая ошибка: won't overwrite bar.jpg - check the regexp error. А если запускаю вот так: perl foo.pl ./bar.jpg, то такая: chdir at foo.pl line 7.

anonymous
()