Выполнение сложных задач на серверах с Linux часто требует передачи результатов выполнения одного приложения в последующие, иногда сразу в несколько разных. С этой целью и используют утилиту xargs, способную считывать данные со стандартного ввода или ранее сохраненного файла и разбивать на группы согласно заданным параметрам. Способов применения этого продукта масса, и мы в этой статье рассмотрим наиболее популярные.
Общая информация
Полученные в результате сбора данные передаются по цепочке как аргумент. В общем случае синтаксис утилиты xargs для Linux выглядит так:
Удаление файлов
Один из самых простых и понятных примеров — удаление файлов по списку, собранному командой find. Такая процедура необходима, например, для удаления файлов конкретного типа (временных, дублей и т.д.). Чтобы сделать это автоматически по результату поиска, следует передать утилите xargs список удаляемого содержимого, сгенерированного find. Приведем команду для расширения *.sh:
При желании провести такую процедуру можно и без xargs:
Правда, приведенная команда может не сработать для файлов, имя которых содержит хотя бы один пробел. Решение проблемы есть: для команды find — это опция print0, для утилиты xargs — -0. Их применение позволяет заменить разделитель по умолчанию (перенос строки на нуль-символ). Пример:
или
Последняя команда нацелена на удаление всех временных файлов.
Сжатие файлов
Еще одна популярная операция — архивация данных, всех находящихся в каталоге или отдельно взятых (например, по расширению). Первое будет выполнено по команде:
Второй пример показывает, как сжать все файлы с расширением .sh:
vds
477 ₽/мес
657 ₽/мес
Переименование файлов
Востребована и процедура пакетного переименования файлов. Многие форматы позволяют делать это, например, чтобы открыть проект в другом приложении без конвертирования структуры. Так, текстовые файлы .TXT в .DOC можно преобразовать при помощи редактора sed:
Результат переименования пользователь увидит на экране, в консоли будет отображен список всех обработанных файлов. В возможности утилиты xargs входит добавление дополнительных символов к имени, например, текущей даты:
Здесь вместо <…> можно подставить любую комбинацию символов. Весьма удобная функция для ручного создания нескольких резервных копий одних и тех же файлов, если проводится их пакетная обработка.
Изменение прав для каталогов и файлов
При администрировании серверов пользователи неизбежно сталкиваются с необходимостью менять права на каталоги или отдельные файлы (их группы). Например, чтобы сменить владельца, когда организация обновила штат исполнителей, и новый сотрудник перестраивает систему «под себя». Пример изменения в xargs user1 на user2:
Чтобы найти все каталоги с правами user1 и автоматически заменить их на группу user2, пригодится команда:
Сложные операции
Пара утилит find и xgars предоставляет настоящее «поле для экспериментов» благодаря поддержке достаточно сложных по структуре команд с комбинированием различных опций. Пример удаления временных файлов старше 7 календарных дней:
Или принудительная остановка процессов, запущенных более 5 дней назад:
Вырезание строк из текстов
При пакетной обработке текстовых файлов может понадобиться функция вырезания отдельных строк (командой cut). Например, нижеследующая команда отобразит на экране полный перечень пользователей:
Следующая команда последовательно откроет файлы на редактирование утилитой vim. Сохранение изменений понадобится подтвердить по каждому из них нажатием Y/N.
Еще один актуальный пример – поиск самого большого файла в каталоге:
Параллельный запуск нескольких процессов
Часто используют возможность параллельного запуска однотипных процессов. Например, чтобы заархивировать несколько каталогов в tar.gz:
Здесь опция –P задает максимальное количество одновременно выполняемых процессов. Подобным образом легко поставить на скачивание любое множество файлов:
Приведенная команда скачает все изображения с расширением .jpg с указанного сайта, при этом одновременно будет запрашиваться по 10 файлов.
Подведем краткие итоги
Важно учитывать, что утилита xargs по умолчанию не умеет работать с именами, содержащими пробел. Обойти такое ограничение можно либо применением опции -0, либо следующим вариантом команды:
Данные, принятые со стандартного ввода, должны разделятся пробелом или переносом строки. Группировку выполняют при помощи одинарных или двойных кавычек. Иной разделитель можно указать опцией -d. При отсутствии каких-либо опций выполняется команда /bin/echo.
В ряде случаев xarg можно заменить циклом for:
или
Еще немного примеров
Выше мы рассмотрели стандартные операции. На практике же встречается масса весьма интересных ситуаций, когда утилита xargs позволяет оперативно решить задачи вроде блокировки конкретных хостов или генерирования уникальных паролей.
Бан IP-адресов по списку
Непосредственно бан осуществляется сетевым экраном IPTables. Но внести в него список адресов для блокировки можно при помощи xargs (правило DROP обязательно):
Меняем формат URL
Преобразование вида ссылки может понадобиться при работе с поддоменами. Попробуем сделать это, изменив http://www.new.domen.com в http://www.domen.com.
Генерация пароля
Команда для создания уникального пароля из случайного набора 8 символов:
Конечно, для этой цели существует отдельное решение, утилита pwgen, но знать и о таком способе полезно.
Поиск бинарных файлов
Процедура востребована при ручном удалении вирусной активности, когда на удаленный хост была совершена атака с инъекцией вредоносного кода. Обычно такие бинарники устанавливаются «мимо» менеджера пакетов dpkg и легко обнаруживаются по данному признаку:
Остается также пакетно удалить их при помощи той же утилиты.
Удаление устаревших пакетов ядра
Полезно знать, как быстро освободить место на диске от неактуальных обновлений:
Разверните свой Linux VDS в Timeweb Cloud
477 ₽/мес
657 ₽/мес
Заключение
Приведенные примеры использования утилиты xargs показывают, почему она столь популярна в среде системных администраторов. Типовые функции — это лишь вершина айсберга, и при должной фантазии этот продукт легко превратить в повседневный инструмент с разнообразными задачами, большинство которых реально автоматизировать и тем самым снизить риски ошибок из-за человеческого фактора.
