Возможность объединения нескольких команд 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. Он используется в программах на Си для обозначения завершения строки, и необходим практически для всех встроенных функций работающих со строками.
Для того чтобы разбивать строки по этому символу используется опция -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. Как видите это довольно простая утилита, которая перенаправляет вывод одной программы в аргументы другой.
есть алиасы. одинраз настроил, и всё, хотя линукс ещё тот извращенец. Спасибо за стаью. попробую.
тоже можно использовать tr
ls ~/Изображения | tr "\n" " "
это лучший сайт) всегда все понятно