bashumerate: простая утилита для пакетной обработки файлов в Linux без xargs
Если вы когда-нибудь пытались выполнить одну и ту же команду для десятков файлов в Linux, то наверняка сталкивались с xargs, find -exec или циклами for в bash. Каждый из этих инструментов имеет свои недостатки: от громоздкого синтаксиса до проблем с пробелами в именах файлов. Разработчик под псевдон

Если вы когда-нибудь пытались выполнить одну и ту же команду для десятков файлов в Linux, то наверняка сталкивались с xargs, find -exec или циклами for в bash. Каждый из этих инструментов имеет свои недостатки: от громоздкого синтаксиса до проблем с пробелами в именах файлов. Разработчик под псевдонимом Numerator создал bashumerate — bash-скрипт, который призван упростить этот процесс, предлагая интуитивно понятный синтаксис с плейсхолдерами и автоматической обработкой специальных символов.
Что такое bashumerate
bashumerate — это скрипт на чистом bash, который позволяет выполнять произвольные команды для каждого файла в заданном наборе. В отличие от xargs, где нужно помнить флаги -I и -0, bashumerate использует простой шаблон: вы указываете команду с плейсхолдером {file}, который автоматически заменяется на имя обрабатываемого файла. Например, чтобы конвертировать все файлы .wav в .mp3 с помощью ffmpeg, достаточно выполнить: bashumerate '.wav' 'ffmpeg -i {file} {file}.mp3'. Скрипт поддерживает рекурсивный обход директорий через шаблон /.расширение, фильтрацию по расширениям и безопасную обработку файлов с пробелами и специальными символами.
Основное преимущество bashumerate — простота. Вам не нужно изучать сложные флаги или писать многострочные скрипты. Скрипт работает «из коробки»: скачайте, сделайте исполняемым и используйте. Он идеально подходит для быстрых одноразовых задач, где xargs кажется избыточным.
Как работает bashumerate
Скрипт написан на чистом bash и использует встроенные возможности оболочки для обхода файлов. Синтаксис предельно прост: bashumerate . Шаблон определяет, какие файлы обрабатывать — например, .jpg или /.txt для рекурсивного поиска. Команда задаётся с плейсхолдером {file}, который заменяется на полный путь к файлу.
Примеры использования: bashumerate '.log' 'gzip {file}' сожмёт все лог-файлы в текущей директории. Для рекурсивной обработки: bashumerate '/.log' 'gzip {file}'. Скрипт также поддерживает опцию --dry-run, которая показывает, какие команды будут выполнены, без их фактического запуска. Это полезно для проверки перед массовыми операциями.
В отличие от xargs, bashumerate автоматически экранирует пробелы и специальные символы в именах файлов, поэтому вам не нужно беспокоиться о флагах -0 или -print0. Однако это достигается ценой производительности: скрипт обрабатывает файлы по одному, а не пакетами, как xargs с флагом -n. Для большинства повседневных задач это не критично, но при работе с тысячами файлов xargs может быть быстрее.
Какие задачи решает bashumerate?
bashumerate особенно полезен для массового переименования, конвертации медиафайлов, архивации логов, поиска и замены текста в группе файлов. Например, чтобы переименовать все файлы .txt в .md: bashumerate '.txt' 'mv {file} {file%.txt}.md'. Или чтобы найти и заменить слово «foo» на «bar» во всех файлах .html: bashumerate '.html' 'sed -i "s/foo/bar/g" {file}'.
Для системных администраторов и разработчиков, которые часто работают с файловыми операциями, bashumerate может стать удобным инструментом быстрого реагирования. Он не требует установки дополнительных пакетов — достаточно скачать скрипт с GitHub и сделать его исполняемым. Это особенно ценно на серверах, где нет прав на установку ПО.
Сравнение с xargs и альтернативами
xargs — один из старейших инструментов Unix, появившийся ещё в 1970-х годах. Он позволяет принимать список элементов из стандартного ввода и выполнять для них команду. Однако его синтаксис считается неинтуитивным: для замены подстроки нужен флаг -I, для работы с нуль-терминированными строками — -0. Многие пользователи вместо xargs предпочитают использовать циклы for в bash или find с -exec, но и эти подходы имеют ограничения.
Современные альтернативы, такие как GNU Parallel, предлагают больше возможностей (параллельное выполнение, прогресс-бар), но требуют установки и изучения. bashumerate, напротив, представляет собой один скрипт, который можно скачать и сразу использовать без дополнительных зависимостей. Он ориентирован на простые сценарии, где не нужны параллелизм или сложные очереди.
Для пользователей, уже знакомых с xargs или GNU Parallel, bashumerate может стать более простой альтернативой для быстрых одноразовых задач. Однако для сложных сценариев с параллелизмом или продвинутой фильтрацией он вряд ли заменит специализированные инструменты.
Как установить bashumerate
Установка bashumerate проста: склонируйте репозиторий с GitHub или скачайте скрипт напрямую. Затем сделайте его исполняемым: chmod +x bashumerate. Для удобства можно переместить скрипт в директорию, входящую в PATH, например /usr/local/bin. После этого вы можете вызывать bashumerate из любого места.
Скрипт написан на bash и не требует дополнительных зависимостей, поэтому он будет работать на любом дистрибутиве Linux с установленным bash. Это делает его идеальным для серверов, где минимизация зависимостей критична.
Планы развития проекта
Пока bashumerate — это личный проект Numerator, опубликованный на GitHub. Скрипт распространяется под лицензией MIT, так что любой желающий может его использовать и модифицировать. Автор планирует добавить поддержку параллельного выполнения (возможно, через флаг -j), а также улучшить обработку ошибок.
Вероятно, bashumerate не станет массовой заменой xargs — слишком велика инерция устоявшихся инструментов. Однако для тех, кто ищет более лаконичный и понятный способ массовой обработки файлов, это может стать удобным решением.
Итог
bashumerate — это простой bash-скрипт, который упрощает пакетную обработку файлов в Linux, избавляя от необходимости помнить сложные флаги xargs. Он не претендует на роль универсального инструмента, но может стать полезным дополнением к арсеналу системного администратора или разработчика. Следить за проектом стоит тем, кто ценит минимализм и прозрачность кода.