Возможность объединения нескольких команд Linux в терминале и использования их в качестве конвейера, когда каждая следующая команда получает вывод предыдущей — очень мощный и гибкий инструмент. Но команды можно объединять не только так. С помощью утилиты xargs вывод предыдущей команды можно передать в аргументы следующей.
В этой небольшой статье мы рассмотрим что из себя представляет утилита xargs, как ею пользоваться, а также подробно разберем возможные параметры и примеры применения.
Синтаксис команды немного запутанный, но в нём можно разобраться:
$ первая_команда | xargs опции вторая_команда аргументы
Сначала выполняется любая первая команда и весь её вывод по туннелю передается в xargs. Затем этот вывод разбивается на строки и для каждой строки вызывается вторая команда, а полученная строка передаётся ей в аргументах.
Для настройки поведения утилиты xargs можно использовать опции. Давайте их рассмотрим:
Это далеко не все опции утилиты. Если вам нужны опции, которых нет в данной статье выполните команду:
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. Как видите это довольно простая утилита, которая перенаправляет вывод одной программы в аргументы другой.
Источник: https://losst.ru/ Материал распространяется под лицензией CC-BY-SA
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies