Как использовать команду `xargs` в Linux: Полное руководство
Команда xargs является одной из наиболее мощных и универсальных утилит, доступных в системах Unix/Linux. Она строит и выполняет команды, считывая аргументы из стандартного ввода, эффективно устраняя разрыв между командами, которые производят вывод, и командами, которые принимают аргументы. Независимо от того, управляете ли вы тысячами файлов, автоматизируете повторяющиеся задачи оболочки или строите сложные конвейеры команд, освоение xargs значительно повысит вашу эффективность работы в терминале.
В этом подробном руководстве мы рассмотрим, как xargs работает изнутри, разберём практические примеры из реальной жизни, объясним все основные параметры и покажем, как избежать распространённых ошибок.
Что такое команда xargs и как она работает?
По своей сути xargs считывает элементы из стандартного ввода (stdin) — как правило, разделённые пробелами или символами новой строки — и передаёт их в качестве аргументов указанной команде. Это критически важно, поскольку многие команды Unix не принимают данные из канала напрямую в качестве аргументов; они ожидают аргументы в командной строке. xargs элегантно решает эту проблему.
Базовый синтаксис выглядит следующим образом:
command | xargs [options] another_commandНапример, чтобы найти все файлы .txt в текущем каталоге и удалить их:
find . -name "*.txt" | xargs rmЗдесь find генерирует список имён файлов .txt и записывает их в stdout. xargs считывает этот список и передаёт имена файлов в качестве аргументов команде rm, которая затем удаляет их — всё в одной эффективной операции.
> Почему бы не использовать rm $(find . -name "*.txt")? Подстановка команд может давать сбои или вести себя непредсказуемо, когда список аргументов чрезвычайно длинный или когда имена файлов содержат специальные символы. xargs обрабатывает оба сценария более безопасно и эффективно.
Базовое использование xargs
Прежде чем перейти к продвинутым примерам, давайте чётко разберёмся с базовым шаблоном вызова.
Передача простого списка аргументов
echo "file1.txt file2.txt file3.txt" | xargs touchЭта команда создаёт три файла — file1.txt, file2.txt и file3.txt — передавая все три имени в качестве аргументов команде touch. Без xargs вам пришлось бы либо вводить каждое имя файла вручную, либо писать цикл.
Проверка того, что выполнит xargs
Перед запуском потенциально деструктивной команды используйте флаг -t, чтобы вывести сформированную команду в stderr перед её выполнением:
echo "file1.txt file2.txt" | xargs -t rmВывод:
rm file1.txt file2.txtЭто бесценно для отладки конвейеров перед их окончательным запуском.
Практические примеры использования xargs
1. Удаление файлов, найденных командой find
Одним из наиболее распространённых и мощных применений xargs является его сочетание с find для удаления файлов, соответствующих определённым критериям:
find /var/log -name "*.log" -mtime +30 | xargs rmЭта команда находит все файлы .log в /var/log, которым более 30 дней, и удаляет их. Такая автоматизированная очистка необходима для обслуживания серверов — с этим регулярно сталкиваются администраторы, использующие VPS Хостинг или Выделенные серверы, чтобы контролировать использование дискового пространства.
2. Ограничение количества аргументов на одно выполнение с помощью -n
По умолчанию xargs передаёт как можно больше аргументов команде за один вызов. Параметр -n позволяет точно контролировать, сколько аргументов передаётся за одно выполнение:
echo "one two three four five six" | xargs -n 2 echoВывод:
one two
three four
five sixЭто особенно полезно, когда команда имеет ограничение на количество принимаемых аргументов или когда вы хотите обрабатывать элементы контролируемыми пакетами.
3. Обработка имён файлов с пробелами и специальными символами с помощью -0
Это одна из наиболее важных практик безопасности при использовании xargs. Имена файлов, содержащие пробелы, символы новой строки или другие специальные символы, нарушат работу наивных конвейеров. Решение состоит в использовании find с -print0 (который разделяет имена файлов нулевыми байтами вместо символов новой строки) и xargs с -0:
find . -name "*.txt" -print0 | xargs -0 rmНулевой байт (
