LINUX.ORG.RU

nomenus-rex 0.3.0 — утилита для массового переименования файлов

 ,


0

1

Добавлены новые «правила» (блоки для формирования итогового имени):

  • имя файла (исходное имя файла без расширения);
  • размер файла.

Nomenus-rex это консольная утилита для массового переименования файлов. Настраивается с помощью простого конфигурационного файла. Например:

    source_dir = "/home/user/work/source";
    destination_dir = "/home/user/work/destination";

    keep_dir_structure = true;
    copy_or_rename = "copy";

    rules = ( 
    {
        type        = "date";
        date_format = "%Y-%m-%d";
    },
    {   
        type        = "text";
        text        = "_";
    },
    {   
        type        = "dir";
        // mode     = "whole path"|"parent dir only"
        mode        = "whole path";
        separator   = "-";
      
    },
    {   
        type        = "text";
        text        = "_";
    },
    {   
        type        = "integer";
        // mode     = "global"|"local at every dir"
        mode        = "local at every dir";
        start       = 0;
        step        = 1;
        padding     = 5;
    },
    /*{   
        type        = "filename";
        // mode     = "lowercase"|"uppercase"|"sic"
        mode        = "lowercase";
    },*/
    {   
        type        = "text";
        text        = "_";
    },
    {   
        type              = "filesize";
        // dimension      = "B"|"KiB"|"MiB"|"GiB"
        dimension         = "KiB";
        show_dimension    = true;
        decimal_separator = ",";
    },
    {   
        type        = "extension";
        // leave the "ext" variable empty to use an original extension
        ext         = "";
        // mode     = "lowercase"|"uppercase"|"sic";
        mode        = "lowercase";
    } 
);

Утилита использует переменные XDG_CONFIG_HOME и HOME, поэтому конфиги можно хранить в специальной директории. Также возможно использование символа ~ в смысле /home/[username]

По ссылке также доступна сборка программы для AMD64. Программа написана на C++ и распространяется на условиях GPL 3.0.

>>> Подробности и код



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

Настраивается с помощью простого конфигурационного файла. Например:

с помощью простого конфигурационного файла

простого конфигурационного файла

простого

ну т.е. одна синтаксическая ошибка и привет?

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

а те, кто не обычный пользователь — и так для себя напишут одноразовый однострочник переименовывающий файлы.

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

ну т.е. одна синтаксическая ошибка и привет?

Ты пробовал или просто предположил? Я вот не знаю, что сабжевая программа делает при обнаружении ошибок в конфиге. Хороший, кстати, вопрос, интересно, что ТС ответит.

а те, кто не обычный пользователь — и так для себя напишут одноразовый однострочник переименовывающий файлы.

Между «обычным пользователем» и «гуру баша 80 уровня» обычно есть множество промежуточных состояний, думаю, что программа для них.

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

ну т.е. одна синтаксическая ошибка и привет?

Конфиги они такие, да. Они все такие. Одна ошибка и «привет».
Впрочем, программа не немая. Многие ошибки она детектирует и развёрнуто сообщает о них пользователю.

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

Я вот не знаю, что сабжевая программа делает при обнаружении ошибок в конфиге. Хороший, кстати, вопрос, интересно, что ТС ответит.

https://github.com/ANGulchenko/nomenus-rex/blob/master/configurationparser.cpp

Тестов у ТСа тоже никаких нет…

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

Каждое «правило» это малнький кусочек результирующего имени файла.
Правила обрабаиываются в порядке их следования в массиве.
Т.е. если ты расположишь правила так:

{
    type        = "date";
    date_format = "%Y-%m-%d";
},
{   
    type        = "text";
    text        = "_BlaBla";
},
{   
    type        = "extension";
    // leave the "ext" variable empty to use an original extension
    ext         = "";
    // mode     = "lowercase"|"uppercase"|"sic";
    mode        = "lowercase";
} 

То ты получишь в результате что-то вроде 2022-03-28_BlaBla.txt
В документации есть один пример.

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

А чем она лучше rename ?

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

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

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

А

Можно сделать что-то вроде filename->substr_replace->extension.
В следующей версии добавлю.

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

Она существует, а банальный скрипт на баше – нет.

Практика показывает что банальный скрипт нифига не банален. На первый взгляд кажется что там работы на 3 минуты: получить список файлов, придумать новые имена, а как их придумать? Ой а что делать с коллизиями? А директории сохранять? А регистр бы выровнять… И вот 3 минуты прошло, а ты ещё не успел даже придумать что писать.

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

Вопрос автору… А какая такая нужда привела вас к написанию этой тулзы? На своем ~30 летнем опыте потребность в batch renaming возникала пару раз. Тот же Гугл на запрос «linux batch rename files» выдает 100500 рецептов и тулзов для этого.

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

какая такая нужда привела вас к написанию этой тулзы?

Мне регулярно притаскивают архив с безобразно названными файлами. А мне с этими файлами работать потом. В том числе с их названиями. Мне намного удобней когда названия подчиняются хоть какой-то логике. Особенно мне важны даты в начале файла. И нет, дата «Вчерашний_отчёт» меня не устраивает.

100500 рецептов и тулзов

Был я там. Попробовал пяток из какого-то списка a la «лучшие утилиты для переименования». Ни одна из них мне не понравилась. Там наркоманский GUI, там настраивается с помощью какого-то регекспоподобного заклинания, одна вообще не заработала.

Так что теперь будет 100501 рецептов и тулзов

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

Конфиг выглядит так, как будто проще написать скрипт для массового переименования файлов через mv.

kirill_rrr ★★★★★
()

Выглядит сложно. Нужно что-то качать, устанавливать, читать. Обычно я для таких задач ищу готовые однострочники на шелловых языках.

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

Ух ты, какая вундервафля. Надо будет в репах покопаться, посмотреть. Спасибо👍

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

Ниасилил? Это делается так:

  • создаешь структуру
ProcessParams { fs::path absolute, fs::path relative };

Передаешь ее в виртуальную функцию:

virtual string process(ProcessParams const & params);

rule->process({.absolute=absolute_path, .relative=relative_path});

Конкретные реализации process используют только те параметры, которые им нужны.

https://pdimov.github.io/blog/2020/09/07/named-parameters-in-c20/

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

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

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

Что-то конфиг замудрёный. Проще уж на баше быстренько накалякать, чем с такими конфигами упражняться.

CrX ★★★
()

Ради любопытства пытаюсь разобраться в парсере конфига. Споткнулся о замечательную функцию:

makeSureThatConfigDirIsExist();

Exist — это глагол, не пассивный.
Make sure — Ensure.
That — не нужон.
ensureConfigDirExists()

Код комментировать не буду :) Добавь тесты.

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

https://github.com/ANGulchenko/nomenus-rex/blob/master/configurationparser.cpp

Там libconfig. Собственно парсера у ТС никакого нет. При синтаксической ошибке в конфиге, libconfig кидает исключение, если мне память не изменяет. Обработок исключений я в коде не нашел.

filosofia
()

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

Советую перенести все настройки кроме «rules» в аргументы командной строки. Я полагаю, что формат переименования плюс-минус один (может несколько в разных конфигах) на все случаи жизни. А src/dst всегда разные. Меня бы люто бесило править конфиг CLI утилиты перед каждым ее вызовом.

filosofia
()

rules

Мне бы, как пользователю, вероятно было удобнее задать правила однострочником в аргументах командной строки. Ну например

$ ./exe ~/archive ~/Downloads/xxx -R '$date(%Y-%m-%d)sometext$counter(0,1,5)'
filosofia
()
Ответ на: комментарий от filosofia

Директории можно указывать как в конфиге, так и в командной строке. Можно даже одновременно в обоих местах, тогда у аргументов командной строки приоритет выше.

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

Обработок исключений я в коде не нашел.

А что там обрабатывать? Ошибка в данном случае это останов. Так что

catch(const ParseException &pex)
{
	std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
			  << " - " << pex.getError() << std::endl;
	exit(EXIT_FAILURE);
}

вполне достаточно.

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

Очередное наколеночное поделие на плюсах сомнительной полезности.

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

Если задача одноразовая, то такого скрипта нет, а если задача повторяющаяся, то такой скрипт есть.

Все остальные вопросы решаются быстро и легко, если знаешь bash/perl/etc и регулярные выражения.

Кроме того, решение на баше намного гибче, чем какой-то конфиг.

Так что да, соглашусь с высказанным выше мнением, что «Очередное наколеночное поделие на плюсах сомнительной полезности.»

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

Раз ТС надо, значит программа уже нужная.

Лишний раз поупражняться в %PROGRAM_LANGUAGE_NAME% никогда не лишне. А тут ещё есть вероятность, что утилита окажется кому-нибудь полезной.

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

Чем это лучше встроенной в гном (наутилус)?

Тут очевидно:

  • не требует гном и его части;
  • возможно использовать в скриптах и через cron.
skiminok1986 ★★★★★
()

Благодарю за информацию. Очень полезная и нужная утилита.

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

Exist — это глагол, не пассивный.

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

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

Думаешь, по-русски будут называть сделатьУвереннымЧтоКаталогКонфигурацииЕстьСуществует ?

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

Возникнут вопросы к согласованности выражения, терминологии и стилю :)

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

makeSureThatConfigDirIsExist

тут оттенка и герундия не хватило, должно быть так:

makeSureThatThisFuckingConfigDirIsExisting()

замена на Exists даст неверное предположение о работе функции.

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

И вот 3 минуты прошло, а ты ещё не успел даже придумать что писать.

а ты ещё не успел даже придумать что писать в конфиг nomenus-rex ^_^

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

ps. а что с превью изменений имен, они есть? в доке не вижу

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

ps. а что с превью изменений имен, они есть?

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

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

возможно использовать в скриптах и через cron.

В каких случаях это может пригодиться?

Лично для меня основное применение данной функции - переименование серий внутри сезона какого-нибудь сериала

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

В каких случаях это может пригодиться?

Например, в нейкий пул прилетают файлы с кривыми именами и это не исправить. Забираешь оттуда файлы, переименовывая на лету.

Лично для меня основное применение данной функции - переименование серий внутри сезона какого-нибудь сериала

Для такого, насколько я понял сабжевую утилиту, можно обойтись чем попроще.

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