The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Выпуск nomenus-rex 0.4.0, утилиты для массового переименования файлов

05.04.2022 07:33

Доступна новая версия консольной утилиты Nomenus-rex, предназначенной для массового переименования файлов. Программа написана на языке C++ и распространяется на условиях лицензии GPLv3. Правила для переименования настраиваются с помощью конфигурационного файла. Например:


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

   keep_dir_structure = false;
   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        = "extension";
           // leave the "ext" variable empty to use an original extension
           ext         = "";
           // mode     = "lowercase"|"uppercase"|"sic";
           mode        = "lowercase";
       }
   );

При использовании указанных настроек утилита переименует файл "/home/user/work/source/TestDir2/file2.txt" в "/home/user/work/destination/2022-03-16_TestDir2_0.txt". Утилита также умеет работать с директориями HOME и XDG_CONFIG_HOME (где ищет файл конфигурации в случае если к нему не указан полный путь) и понимает сокращение "~" для обращения к домашнему каталогу.

Изменения в новой версии:

  • Добавлен новый вид "правил", принимающий в качестве параметра текущее незавершённое имя. Это позволило добавить правило replace, заменяющее все вхождения подстроки на новую строку.
  • Теперь имена файлов сортируются по алфавиту перед обработкой. Ранее файлы обрабатывались в том порядке, в котором отдавались файловой системой. В следующей версии эта сортировка станет управляемой пользователем.
  • Несколько переработана документация, что сделало её более удобной.
  • Внутренние изменения в коде (начало создания тестов и новая шаблонная функция для чтения enum-переменных из файла конфигурации) которые призваны упростить добавление новых правил и уменьшить количество новых ошибок.


  1. Главная ссылка к новости (https://github.com/ANGulchenko...)
  2. OpenNews: Выпуск утилиты для резервного копирования rclone 1.58
  3. OpenNews: Выпуск СУБД SQLite 3.38 и набора утилит sqlite-utils 3.24
  4. OpenNews: Релиз минималистичного набора системных утилит BusyBox 1.35
  5. OpenNews: Выпуск набора базовых системных утилит GNU Coreutils 9.0
Автор новости: A.Stahl
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/56967-nomenus-rex
Ключевые слова: nomenus-rex
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (31) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 09:19, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    А смысл городить тысячи строк на С++, когда для каждого конкретного
    случая на коленке можно смастерить что-то типа

    #!/bin/sh

    for dict in 'ls *[0-9]'; do
    dict_name='echo $dict| sed 's/download?id=//''
    echo $dict_name.mp3
    mv "$dict" $dict_name.mp3
    done

     
     
  • 2.2, Аноним (2), 09:22, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    у кого-то может быть аллергия на портянки
     
     
  • 3.12, ИмяХ (?), 10:48, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Эта "портянка" в несколько раз меньше конфига в новости.
     
     
  • 4.30, Аноним (30), 01:43, 06/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Так у нее и функциональность меньше. И скорость работы вероятно тоже.
     
  • 2.3, A.Stahl (ok), 09:25, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Я не умею красиво писать о простых вещах. Загугли "unixway". Уверен кто-то описал это лучше чем я. Кратко: хорошо иметь программы, выполняющие одну конкретную и внятную функцию, а не писать на каждый чих одноразовые велосипеды.
     
     
  • 3.4, Аноним (1), 09:45, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ну не знаю, мне всегда казалось, что применение сочетания мелких утилит типа ls/mv/sed/awk для решения таких задач как массовое переименование и есть unixway, а не создание отдельной утилиты для каждой задачи.

     
  • 3.5, Аноним (5), 09:45, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > выполняющие одну конкретную и внятную функцию
    > copy_or_rename = "copy";

    ____

    > на каждый чих одноразовые велосипеды

    Ну смотри. Есть такая реальная задача. Имеем следующие файлы:

        torrents/<TORRENT_ID>/**/*.{mp4,mkv,...}

    Их нужно не скопировать, а организовать на них симлинки и класть их сюда:

        videos/<VIDEO_HEIGHT_IN_PIXELS>_<FILENAME>.<EXT>

    Как, если не "одноразовыми велосипедами", такое организовать? Если идти по пути "юниксвея" (на самом деле нет), то в сабж придется добавлять поддержку ffmpeg. И поддержку симлинков. А опция наверное будет называться copy_or_rename_or_symlink.

     
     
  • 4.6, Аноним (6), 09:53, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > А опция наверное будет называться copy_or_rename_or_symlink

    не проще разделить на три? разделяй и властвуй, как говорится

     
  • 4.7, A.Stahl (ok), 09:59, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Да, программы не приспособлены для решения очень необычных задач. Тут пользователь сам по себе. Впрочем никто не запрещает создать "правило", вызывающее какую-то внешнюю утилиту как раз для таких нестандартных случаев.

    >А опция наверное будет называться copy_or_rename_or_symlink.

    Опция по своей сути -- enum. Если вдруг создание симлинков будет востребованой задачей, то почему нет? Просто переменная будет переименована во что-то более общее, вроде "processing_mode".

     
     
  • 5.10, Аноним (5), 10:20, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > создать "правило", вызывающее какую-то внешнюю утилиту как раз для таких нестандартных случаев

    суть в том, что правила будут занимать не меньшее число строк, чем пресловутые баш-портянки. Но зато не дадут всей гибкости скриптов. Например, забыл упомянуть, что нужно ставить симлинки не на все видео-файлы, а только на те, что НЕ называются /^proxy_\d+\.avi$/.

    > processing_mode

    Ну теперь программа явно выполняет не просто "одну конкретную и внятную функцию".

     
     
  • 6.11, A.Stahl (ok), 10:29, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >будут занимать не меньшее число строк

    Так суть не в количестве строк, а в их тривиальности.
    Уверен что тебе будет проще написать 5 строк на русском языке, чем две на клингонско-армянском диалекте.

    >Ну теперь программа явно выполняет не просто "одну конкретную и внятную функцию".

    Не-а. Всё равно одну прикладную задачу. На задачи следует смотреть с точки зрения пользователя, а не сортировать по сисколлам.

     
  • 5.27, Аноним (2), 19:12, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    и ещё
     
  • 4.8, Аноним (8), 10:01, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно. Это KRename, он 1000 лет существует.
     
     
  • 5.9, Аноним (8), 10:06, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Просто, я сомневаюсь, что это действие нужно выполнять чаще, чем никогда. А если выполнять по завершению загрузки, то однострочник уже написан в любом случае (хотя это и не выглядит очень удобным, но у каждого свои тараканы, я тоже добавляю высоту перед расширением, чтобы отличать файлы с одним именем и разным содержимым).
     
  • 3.26, Аноним (2), 19:11, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    минус за тупой треп
     
  • 2.14, Аноним (14), 11:13, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Очевидно же, что дело в производительности. В вашем скрипте целая куча программ запускается, это создаются процессы, передаются данные. Внутри программы, которая в одном процессе делает все нужные вызовы, ничего этого не происходит.

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

     

  • 1.13, Аноним (13), 11:11, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    rename на перле же есть.
     
     
  • 2.15, Аноним (14), 11:16, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Программисты на сиплюсах не могут в перл.
     
     
  • 3.16, A.Stahl (ok), 11:52, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    И наоборот.
     
     
  • 4.23, CAE (ok), 15:28, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    И наоборот умеют.
     
  • 3.22, CAE (ok), 15:27, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Умеют.
     

  • 1.17, Аноним (17), 12:18, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    если она на с++, то почему такой наркоманский формат конфига?
    не проще ли использовать плейнтекст с секциями, типа
    [global]
    ....

    [rule1]

    [rule2]

    etc

     
  • 1.18, Аноним (5), 12:21, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    И кстати, название проекта неверное, должно быть rex-nominum.
     
     
  • 2.19, A.Stahl (ok), 12:31, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    С названием вышла история: изначально название было nomen (имя), но все упорно и удивлённо читали его как английское no men. Поэтому я добавил us как наиболее очевидное указание на латынь, а rex уже просто по-приколу.
     

  • 1.20, Аноним (20), 12:50, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Зашел в новость с надеждой, что кто-то запилил гуй хотя бы наподобие того, что есть в Thunar, уж молчу про Doublecmd/Totalcmd. А тут изврат какой-то, смысл которого можно выразить примерно так:
    for fn in *.png; do mv "$fn" "$(basename "$fn" .png)-renamed.png"; done
    Допилить под задачи несложно.
     
  • 1.21, topin89 (ok), 13:01, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    C++ конечно странное решение, ну ладно, скорость там или просто привычка.

    С программой есть другая проблема

    void RuleFilename::process(std::filesystem::path& name)
    {
    result = name.stem();

    switch (mode)
    {
    case Mode::lowercase:
    {
    std::transform(result.begin(), result.end(), result.begin(), ::tolower);
    }break;
    case Mode::uppercase:
    {
    std::transform(result.begin(), result.end(), result.begin(), ::toupper);
    }break;
    case Mode::sic:
    {

    }break;
    }
    }

    Упор на функцию ::tolower. Эта функция есть в двух вариантах, с локалью и без, и в коде намёка на локаль нет. Добавим сюда, что у строка result -- это строка char'ов, а там или ASCII, или неопределённое поведение, которое может приводить и к вылетанию всей программы (C++ такой C++). Так что русские файлы (а так же французские, греческие, немецкие, японские и мноооого других) могут натурально повалить всю программу. А самое забавное, информация об этом есть прямо в доках к tolower на cppreference, так что автор даже беглое ознакомление не осилил.

    Как проект для саморазвития и понимания что к чему -- неплохо, но не для реального использования.

     
     
  • 2.24, CAE (ok), 15:31, 05/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Обработка исключений - для трусов :)

    Но в целом хороший разбор. Кстати, std::filesystem::path тоже имеет "приятные" подводные камни.

     

  • 1.25, КО (?), 19:06, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Без вменяемого гуя, эта прога очередная и никому ненужная.
     
  • 1.28, Аноним (28), 19:38, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Массовое переименование файлов в Thunar покрывает 99% случаев.
     
  • 1.29, Онаним (?), 23:10, 05/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Файлуха не треснет столько файлов переименовывать, чтобы разница в проиводительности с баш-портянкой стала заметной? Или там рамдиск на пару терабайт с файлами по 1 байту в инодах?
     
  • 1.31, InuYasha (??), 10:12, 06/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А теперь запилить GUI как у Flexible Renamer и будет вообще золото.
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2022 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру