15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
28.10.2024
2 +1

Как использовать команду `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

Нулевой байт (

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать