Xargs: Секретное оружие Linux для мощных командных конвейеров
Вы когда-нибудь сталкивались с ситуацией, когда команда в терминале отказывается принимать данные из другой через обычную вертикальную черту? Знакомое разочарование? Есть инструмент, который превращает эту проблему в мощнейший инструмент для автоматизации.
Это xargs — настоящая волшебная палочка для любого, кто работает с командной строкой Linux.
Он кардинально меняет правила игры, позволяя передавать вывод одной программы не в стандартный поток ввода, а прямо в аргументы командной строки следующей. Представьте, что вы можете взять список файлов, сгенерированный одной утилитой, и мгновенно передать их на обработку другой, например, для массового переименования, удаления или изменения прав доступа.
В этом материале мы не просто расскажем о синтаксисе. Вы узнаете, как заставить xargs работать на вас с максимальной отдачей. Мы разберем ключевые опции, которые дают вам полный контроль: как обрабатывать данные построчно, как работать с пробелами в именах файлов и даже как запускать команды в интерактивном режиме для безопасности.
Вы откроете для себя практические примеры, которые сможете сразу применить в своей работе. Узнаете, как эффективно комбинировать xargs с find, ls и другими утилитами для создания невероятно эффективных однострочников.
Мы покажем, как одна простая команда может сэкономить вам часы рутинной работы. Готовы превратить ваш терминал в конвейер по обработке данных? Тогда начинаем!
Возможность объединения нескольких команд Linux в терминале и использования их в качестве конвейера, когда каждая следующая команда получает вывод предыдущей - очень мощный и гибкий инструмент. Но команды можно объединять не только так. С помощью утилиты xargs вывод предыдущей команды можно передать в аргументы следующей.
В этой небольшой статье мы рассмотрим что из себя представляет утилита xargs, как ею пользоваться, а также подробно разберем возможные параметры и примеры применения.
Команда xargs в Linux
Синтаксис команды немного запутанный, но в нём можно разобраться:
$ первая_команда | xargs опции вторая_команда аргументы
Сначала выполняется любая первая команда и весь её вывод по туннелю передается в xargs. Затем этот вывод разбивается на строки и для каждой строки вызывается вторая команда, а полученная строка передаётся ей в аргументах.
Для настройки поведения утилиты xargs можно использовать опции. Давайте их рассмотрим:
- -0, --null - использовать в качестве разделителя нулевой символ. Обычно он находится в конце строки. По умолчанию, в качестве разделителя используется пробел, перевод строки или табуляция;
- -a, --arg-file - прочитать аргументы, которые надо передать команде из файла;
- -d, --delimiter - использовать нестандартный разделитель строк;
- -E, -e, --eof - индикатор конца файла, все символы после вхождения этой строки игнорируются;
- -l, --max-lines - количество строк, передающихся в одну команду по умолчанию все;
- -n, --max-args - количество параметров, которые передаются в одну команду, по умолчанию все;
- -o, --open-tty - открывать новый терминал для дочерних процессов;
- -p, --interactive - спрашивать пользователя о запуске каждой следующей команды;
- -r, --no-run-if-empty - если входной поток данных пустой, команда не будет выполнена;
- --show-limits - посмотреть ограничения на длину параметров в командной строке;
- -t, --verbose - максимально подробный вывод утилиты.
Это далеко не все опции утилиты. Если вам нужны опции, которых нет в данной статье выполните команду:
man xargs
А теперь давайте рассмотрим примеры использования xargs в Linux. Программа ожидает данные из входного потока. Поэтому если мы запустим её без параметров и наберем несколько слов, она просто их выведет. Например:
xargs

Чтобы подробнее понять что происходит можно использовать опцию -t:
xargs -t

Как видите, по умолчанию выполняется команда echo и ей передается всё, что было прочитано из стандартного ввода. Выше мы работали только с одной строкой. Давайте выведем все имена изображений из папки ~/Изображения и отдадим их утилите xargs:
ls ~/Изображения | xargs -t echo

Как видите, одной команде echo были переданы все имена изображений. Если вам надо чтобы каждое изображение обрабатывала отдельно вызванная команда, надо использовать опцию -L или -n, Первая позволяет указать сколько строк надо передавать в одну команду. Вторая - сколько параметров. Различие существенное. В строке может быть несколько параметров разделённых пробелом. Сначала попробуем ограничиться одной строкой:
ls ~/Изображения | xargs -t -L1 echo

Но если попытаться ограничить количество параметров до одного, то возникнет проблема. Утилита будет думать, что имя файла это несколько параметров, поэтому будет дробить его. Зато теперь вы точно знаете как это работает:
ls ~/Изображения | xargs -t -n1 echo

По умолчанию строки разбиваются по символу перевода строки. С помощью опции -d можно указать свой разделитель. Разделитель должен быть совместим с функцией printf из Си. Это означает, что допускаются все символы, а также Escape последовательности вроде n, r, t и других. Например, давайте сделаем разделителем дефис:
ls ~/Изображения | xargs -t -L1 -d - echo
Как и ожидалось, теперь команда будет дробить строки по дефису и выводить каждую полученную строку с помощью echo. В качестве разделителя строк можно использовать нулевой символ. Это символ, который обозначается последовательностью . Он используется в программах на Си для обозначения завершения строки, и необходим практически для всех встроенных функций работающих со строками.
Для того чтобы разбивать строки по этому символу используется опция -0 или --null. Но для того чтобы всё сработало надо чтобы и поставляющая данные команда тоже выводила этот символ. Такая функция есть у команды find, она имеет опцию -print0. Например, выведем снова все имена изображений из папки ~/Изображения с названием Рабочее место:
find ~/Изображения -name "Рабочее место*" -type f -print0 | xargs -t -0 -L1 echo

А если такой параметр не передать, то вы получите ошибку:
find ~/Изображения -name "Рабочее место*" -type f -print0 | xargs -t -L1 echo
Если команда выполняет какие-нибудь опасные действия, вы можете попросить утилиту спрашивать разрешения перед выполнением следующей команды:
find ~/Изображения -name "Рабочее место*" -type f | xargs -p -t -L1 echo

Выводы
В этой статье мы рассмотрели что из себя представляет команда xargs Linux. Как видите это довольно простая утилита, которая перенаправляет вывод одной программы в аргументы другой.