Linux команда xargs объяснение

Обновлено: 04.07.2024

Возможность объединения нескольких команд 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 - максимально подробный вывод утилиты.

Это далеко не все опции утилиты. Если вам нужны опции, которых нет в данной статье выполните команду:

А теперь давайте рассмотрим примеры использования xargs в Linux. Программа ожидает данные из входного потока. Поэтому если мы запустим её без параметров и наберем несколько слов, она просто их выведет. Например:


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


Как видите, по умолчанию выполняется команда echo и ей передается всё, что было прочитано из стандартного ввода. Выше мы работали только с одной строкой. Давайте выведем все имена изображений из папки

/Изображения и отдадим их утилите xargs:

/Изображения | xargs -t echo


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

/Изображения | xargs -t -L1 echo


Но если попытаться ограничить количество параметров до одного, то возникнет проблема. Утилита будет думать, что имя файла это несколько параметров, поэтому будет дробить его. Зато теперь вы точно знаете как это работает:

/Изображения | xargs -t -n1 echo


По умолчанию строки разбиваются по символу перевода строки. С помощью опции -d можно указать свой разделитель. Разделитель должен быть совместим с функцией printf из Си. Это означает, что допускаются все символы, а также Escape последовательности вроде \n, \r, \t и других. Например, давайте сделаем разделителем дефис:

/Изображения | xargs -t -L1 -d - echo

Как и ожидалось, теперь команда будет дробить строки по дефису и выводить каждую полученную строку с помощью echo. В качестве разделителя строк можно использовать нулевой символ. Это символ, который обозначается последовательностью \0. Он используется в программах на Си для обозначения завершения строки, и необходим практически для всех встроенных функций работающих со строками.

Для того чтобы разбивать строки по этому символу используется опция -0 или --null. Но для того чтобы всё сработало надо чтобы и поставляющая данные команда тоже выводила этот символ. Такая функция есть у команды find, она имеет опцию -print0. Например, выведем снова все имена изображений из папки

/Изображения с названием Рабочее место:

/Изображения -name "Рабочее место*" -type f -print0 | xargs -t -0 -L1 echo


А если такой параметр не передать, то вы получите ошибку:

/Изображения -name "Рабочее место*" -type f -print0 | xargs -t -L1 echo

Если команда выполняет какие-нибудь опасные действия, вы можете попросить утилиту спрашивать разрешения перед выполнением следующей команды:

/Изображения -name "Рабочее место*" -type f | xargs -p -t -L1 echo


Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

xargs

Об утилите xargs написано очень много — что можно написать еще? Но если, что называется, копнуть поглубже, то выясняется, что во многих публикациях излагаются лишь самые основы, но нет главного: не объясняется, как можно применять xargs в реальной практике. Статей с разбором сложных и нетривиальных вариантов применения этого весьма полезного для системного администратора инструмента, к сожалению, очень мало. Именно поэтому мы написали свою статью и постарались включить в нее как можно больше примеров использования xargs для решения различных проблем.

Сначала мы рассмотрим принцип работы xargs и разберем примеры попроще, а затем перейдем к разбору сложных и интересных кейсов.

Вспоминаем основы

Принцип работы xargs можно описать следующим образом: программа берет данные из стандартного ввода или из файла, разбивает их в соответствии с указанными параметрами, а затем передает другой программе в качестве аргумента.

В общем виде синтаксис команды xargs можно представить так:


Рассмотрим, как все это работает, на материале простых и хрестоматийных примеров.

Удаление файлов

Одна из самых частых ситуаций, в которых используется xargs — удаление файлов, найденных при помощи команды find.

Представим себе следующую ситуацию: имеется директория, в которой хранится большое количество файлов. Из нее нужно удалить файлы определенного типа (в нашем примере — файлы с расширением *.sh). Чтобы осуществить эту операцию, нужно передать xargs вывод команды find, и к файлам с указанным расширением будет применена команда -rm:

Отметим, что операцию удаления файлов можно осуществить и без xargs, а с помощью команды

Описанный способ не сработает, если в имени одного из удаляемых файлов содержится пробел. Имя, состоящее из двух слов, разделенных пробелом, не будет воспринято как единое целое.

Проиллюстрируем это следующим примером:

Как видим, файл, в имени которого имеется пробел, не был удалён.

Чтобы решить эту проблему, используется опция print0 для команды find и опция -0 для команды xargs. Она заменяет стандартный разделитель (перенос строки на нуль-символ (\x0), который и означает конец хранимой строки:

Xargs может также помочь, например, быстро удалить все временные файлы, имеющие расширение tmp:

Сжатие файлов

Сжать все файлы в текущей директории с помощью gzip можно, введя следующую команду:

Рассмотрим еще один пример: сжатие с помощью tar всех файлов с расширением *.pl:

Переименование файлов

С помощью xargs можно осуществлять массовое переименование файлов. Представим себе, что у нас есть группа файлов с расширением *.txt, и нам нужно заменить это расширение на *.sql. Это можно сделать при помощи xargs и потокового текстового редактора sed:

В результате ее выполнения на консоль будет выведен список переименованных файлов.

С помощью xargs можно также добавлять к дополнительные элементы к именам файлов (например, дату):

Вместо <..> можно подставить всё, что угодно.
Фигурные скобки <> в этом примере означают «текущий аргумент» (т.е. текущее имя файла).

Изменение прав для папок и файлов

С помощью xargs можно также ускорить процесс смены прав на файлы и папки для определенного пользователя или группы. Предположим, нам нужно найти все папки пользователя root и заменить их владельца на temp. Эта операция осуществляется при помощи команды:

Чтобы найти все папки группы root и заменить группу на temp, используется команда:

Xargs и find: сложные операции

С помощью команд find и xargs можно выполнять и более сложные операции. Вот так, например, можно удалить временные файлы, созданные более 7 дней назад:

А вот так — принудительно остановить процессы, которые уже работают больше 7 дней:

Xargs и сut

Xargs довольно часто используется в сочетании с командой cut, позволяющей вырезать строки из текстовых файлов. Рассмотрим некоторые практические примеры. С помощью приведённой ниже команды на консоль будет выведен список всех пользователей системы:


будет последовательно открывать файлы для редактирования в vim.
Обратим внимание на опцию -p. Благодаря ей команда будет выполняться в интерактивном режиме: перед открытием каждого файла будет запрашиваться подтверждение (y/n).

В заключение приведём ещё один сложный и интересный пример — рекурсивный поиск файлов самого большого размера в некоторой директории:

Параллельный запуск процессов

Xargs часто используется для параллельного запуска нескольких процессов. Вот так, например, можно одновременно cжать несколько директорий в tar.gz:

В приведенном примере используется ключ -P. Он указывает максимальное количество процессов, которые будут выполняться одновременно. Предположим, что у нас на входе имеется 10 аргументов. Если мы введём команду xargs с ключoм -P 3, то будет запущено 3 экземпляра команды, следующей после xargs, с каждым из этих аргументов.

С помощью xargs можно также параллельно загружать из Интернета множество файлов:

В приведенном примере с указанного адреса будут скачаны все графические файлы с расширением jpg; ключ -P указывает, что требуется скачивать по 10 файлов одновременно.

Предварительные итоги

    Xargs не работает с файлами, в имени которых присутствует пробел. Для решения этой проблемы с командой xargs используется опция −0. Пробел в имени файла можно обойти также следующим образом:

полностью эквивалента циклу

Нетривиальные примеры

Баним IP-адреса из списка

Чтобы забанить IP-адреса из списка, нужно их добавить в IP tables c правилом DROP. Эта операция осуществляется при помощи команды:


Можно проделать и более сложную операцию и забанить все адреса по AS:

Изменяем формат URL

Генерируем пароль из 10 символов

Сгенерировать надежный пароль можно при помощи команды вида:

Генерировать пароли можно и без помощи xargs: для этого cуществует специализированная утилита pwgen. Некоторые другие способы генерации паролей описаны также здесь.

Ищем бинарные файлы, установленные без использования dpkg

Такая операция может потребоваться в случае, если, например, машина стала жертвой хакерской атаки и на ней было установлено вредоносное программное обеспечение. Выявить, что за программы поставили злоумышленники, поможет следующая команда (она ищет запущенные «бинарники», установленные без использования менеджера пакетов dpkg):

Удаляем устаревшие пакеты ядра

Проблема удаления старых ядер уже обсуждалась на Хабре — см. здесь (по этой же ссылке можно найти любопытные примеры команд).

Преобразуем скрипт в строку

Иногда возникает необходимость преобразовать большой скрипт в одну строку. Сделать это можно так:

Заключение

Как видно из проделанного обзора, возможности xargs гораздо шире, чем это может показаться на первый взгляд. Надеемся, что приведённые в статье примеры окажутся для вас полезными. Если вам известны другие интересные варианты использования xargs — добро пожаловать в комментарии. Читателей, которые по тем или иным причинам не могут оставлять комментарии здесь, приглашаем в наш блог.

Оригинал: Linux Xargs Command with Examples
Автор: linuxize
Дата публикации: 21 декабря 2019 года
Перевод: А. Кривошей
Дата перевода: январь 2020 г.

Утилита xargs позволяет создавать и выполнять команды из стандартного ввода.

Xargs обычно используется в сочетании с другими командами через конвейер. Использование xargs позволяет вам предоставлять стандартный ввод в качестве аргументов утилит командной строки, таких как mkdir и rm.

В этом руководстве мы рассмотрим основы использования команды xargs.

Использование команды xargs

Xargs читает аргументы из стандартного ввода, разделенные пробелами или символами новой строки, и выполняет указанную команду, используя входные данные в качестве аргументов команды. Если команда не указана, по умолчанию используется /bin/echo.

Синтаксис команды xargs выглядит следующим образом:

Самый простой пример использования xargs - передать несколько строк, разделенных пробелами, с помощью канала в xargs и запустить команду, которая будет использовать эти строки в качестве аргументов.

В приведенном выше примере мы передаем стандартный ввод в xargs, и для каждого аргумента запускается команда touch, создавая три файла. Это то же самое, как если бы вы запустили:

Как просмотреть команду и запросить подтверждение пользователя

Чтобы вывести команду на терминал перед ее выполнением, используйте опцию -t (--verbose):

Если вы хотите получить подтверждение выполнения команды, используйте параметр -p (--interactive):

Введите y или Y, чтобы подтвердить и выполнить команду:

Этот ключ полезен при выполнении потенциально опасных команд.

Как ограничить количество аргументов

По умолчанию количество аргументов, передаваемых команде, определяется системным лимитом.

Опция -n (--max-args) указывает количество аргументов, передаваемых данной команде. Xargs будет запускать указанную команду столько раз, сколько необходимо, пока не будут исчерпаны все аргументы.

В следующем примере количество аргументов, считываемых из стандартного ввода, ограничено 1.

Как вы можете видеть из подробного вывода ниже, команда touch выполняется отдельно для каждого аргумента:

Как запустить несколько команд

Чтобы запустить несколько команд с xargs, используйте опцию -I. Она работает путем определения replace-str после ключа -I, а затем все вхождения replace-str заменяются аргументом, переданным в xargs.

В следующем примере xargs будут запущены две команды, сначала она создаст файлы с помощью touch, а затем выведет список файлов с помощью команды ls:

Типичным выбором для replace-str является %, однако вы можете использовать другой заполнитель, например ARGS:

Как указать разделитель

Используйте параметр -d (--delimiter), чтобы задать пользовательский разделитель, который может быть либо отдельным символом, либо escape-последовательностью, начинающейся с \.

В следующем пример мы используем ";" в качестве разделителя:

Как читать элементы из файла

Команда xargs также может читать элементы из файла вместо стандартного ввода. Для этого используйте параметр -a (--arg-file), за которым следует имя файла.

В следующем примере команда xargs будет читать файл ips.txt и пинговать каждый IP-адрес.

Мы также используем опцию -L 1, которая указывает xargs читать по одной строке за раз. Если эта опция не указана, xargs передает все IP-адреса одной команде ping.

Использование xargs с find

xargs чаще всего используется в сочетании с командой find. Вы можете использовать find для поиска определенных файлов, а затем использовать xargs для выполнения операций с этими файлами.

Чтобы избежать проблем с именами файлов, которые содержат символы новой строки или другие специальные символы, всегда используйте параметр find -print0, который заставит find печатать полное имя файла, за которым следует нулевой символ. Этот вывод может быть правильно интерпретирован xargs с помощью опции -0, (--null).

В следующем примере команда find выведет полные имена всех файлов в каталоге /var/www/.cache, а xargs передаст пути к файлам команде rm:

Использование xargs для обрезки пробелов

Xargs также можно использовать как инструмент для удаления пробелов с обеих сторон заданной строки. Просто передайте строку в команду xargs, и она выполнит обрезку:

Это может быть полезно при сравнении строк в скриптах оболочки.

Заключение

К настоящему времени вы должны хорошо понимать, как использовать команду Linux xargs. Для получения более подробной информации о каждой опции xargs прочитайте справочную страницу xargs.

Принцип действия и синтаксис

Прежде чем рассматривать примеры применения, важно разобраться с принципом действия команды. Говоря простыми словами, эта утилита считывает данные из выходных данных другой команды или стандартного потока ввода (по умолчанию) и выполняет команду, переданную в качестве аргумента. Один или несколько раз в зависимости от входных данных. Все пропуски и пробелы во входных данных воспринимаются как разделители, пустые строки игнорируются. Таким образом, в общем виде синтаксис команды следующий:

Если команда в качестве аргумента не передается, по умолчанию утилита выполняет команду echo. Например, в следующем примере мы просто выполнили команду без опций и ввели текст ‘Hello, World!’ в стандартный поток ввода. После нажатия Ctrl+D (чтобы сообщить xargs о завершении ввода), была автоматически выполнена команда echo, и на экран снова был выведен текст ‘Hello, World!’.


Опции

-l [число] -Выполнять команду для каждой группы из заданного числа непустых строк аргументов, прочитанных со стандартного ввода. Последний вызов команды может быть с меньшим числом строк аргументов. Считается, что строка заканчивается первым встретившимся символом перевода строки, если только перед ним не стоит пробел или символ табуляции; пробел/табуляция в конце сигнализируют о том, что следующая непустая строка является продолжением данной. Если число опущено, оно считается равным 1. Опция -l включает опцию -x.

-I [зам_цеп] Режим вставки: команда выполняется для каждой строки стандартного ввода, причём вся строка рассматривается как один аргумент и подставляется в начальные_аргументы вместо каждого вхождения цепочки символов зам_цеп. Допускается не более 5 начальных_аргументов, содержащих одно или несколько вхождений зам_цеп. Пробелы и табуляции в начале вводимых строк отбрасываются. Сформированные аргументы не могут быть длиннее 255 символов. Если цепочка зам_цеп не задана, она полагается равной < >. Опция -I включает опцию -x.

-n [число] Выполнить команду, используя максимально возможное количество аргументов, прочитанных со стандартного ввода, но не более заданного числа. Будет использовано меньше аргументов. Если их общая длина превышает размер (см. ниже опцию -s). Или если для последнего вызова их осталось меньше, чем заданное число. Если указана также опция -x, каждая группа из указанного числа аргументов должны укладываться в ограничение размера, иначе выполнение xargs прекращается.

-t Режим трассировки: команда и каждый построенный список аргументов перед выполнением выводится в стандартный поток ошибок.

-p Режим с приглашением: xargs перед каждым вызовом команды запрашивает подтверждение. Включается режим трассировки (-t), за счет чего печатается вызов команды, который должен быть выполнен, а за ним — приглашение ?…. Ответ y (за которым может идти что угодно) приводит к выполнению команды; при каком-либо другом ответе, включая возврат каретки, данный вызов команды игнорируется.

-x Завершить выполнение, если очередной список аргументов оказался длиннее, чем размер (в символах). Опция -x включается опциями -i и -l. Если ни одна из опций -i, -l или -n не указана, общая длина всех аргументов должна укладываться в ограничение размера.

-s [размер] Максимальный общий размер (в символах) каждого списка аргументов установить равным заданному размеру. Размер должен быть положительным числом, не превосходящим 470 (подразумеваемое значение). При выборе размера следует учитывать, что к каждому аргументу добавляется по одному символу; кроме того, запоминается число символов в имени команды.

-e [лконф_цеп] Цепочка символов лконф_цеп считается признаком логического конца файла. Если опция -e не указана, признаком конца считается подчеркивание (_). Опция -e без лконф_цеп аннулирует возможность устанавливать логический конец файла (подчеркивание при этом рассматривается как обычный символ). Команда xargs читает стандартный ввод до тех пор, пока не дойдет до конца файла или не встретит цепочку лконф_цеп.

Примеры xargs

Ниже рассмотрим наиболее часто используемые примеры команды xargs

Создание конвейеров

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

Например поиск файлов, содержащих заданную строку или текст. Например, поиск всех файлов с расширением txt, содержащих текст ‘abc’, можно выполнить следующим образом:

Вот результат выполнения команды:


В данном случае команда xargs получает входные данные от команды find. И поочередно применяет название файла к команде grep. Которая в свою очередь уже ищет строку в файле.

Просмотр файлов в текущем рабочем каталоге и всех подкаталогов в двух столбцах:

Удалить файлы, созданные более 10 дней назад в директории /tmp

Массовая смена группы пользователей.

Эта команда сменит группу владельцев с root на user на все файлы и каталоги в текущей директории.

Выше приведенных примеров достаточно что бы стало понятно как можно использовать команду xargs. И на основе этих примеров строить уже свои конструкции по использованию. А пока рассмотрим еще несколько примеров.

Использование xargs с другими командами

По умолчанию xargs выполняет команду echo, но можно в явном виде указать любую другую команду. Например, можно передать в качестве аргумента команду find с опцией -name, а затем ввести в стандартном потоке ввода имя файла (или тип файлов), который вы хотите найти.


Многократное выполнение команды (для каждой строки/аргумента)


После этой опции необходимо указать число, которое означает максимальное количество непустых строк, которые за раз передаются команде в качестве входных данных. В нашем случае это значение будет равно 1. Так как нам требуется передача команде find одной строки за раз в качестве входных данных.

Команда будет иметь следующий вид:

А результат будет следующим:


Все работает. Теперь попытаемся ввести аргументы так:

Для таких ситуаций можно воспользоваться опцией командной строки -n.


Обработка имен файлов с пробелами

В начале данной статьи было сказано, что xargs воспринимает пробелы (а также символы новой строки) как разделители. В случае, если передаваемые имена файлов содержат пробелы, это может вызвать проблемы.


Данная команда будет воспринимать в качестве разделителя только символ новой строки.

Получение входных данных из файла

В рассмотренных выше примерах мы получали входные данные из стандартного потока ввода (по умолчанию) или от другой команды. Однако, при необходимости источником входных данных для xargs может быть файл.

Для этого используется опция -a. После которой нужно указать имя файла, используемого xargs в качестве источника входных данных.

xargs -a input.txt ls -lart

Результат выполнения команды:


Запрос разрешения пользователя перед выполнением команды

Мы уже рассмотрели, как обеспечить многократное выполнение команды. Но нам может потребоваться подтверждение пользователя при каждом запуске. Это можно сделать при помощи опции командной строки -p.


Как видим прежде чем удалить файлы команда запросила подтверждение

Заключение

Мы разобрали самые необходимые базовые функции команды xargs, необходимые для работы с этой полезной утилитой. Освоив принципы работы и функции команды, рассмотренные в данном руководстве, вы можете обратиться к соответствующей man-странице.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.


Xargs принимает исходящие данные других программ (это могут быть имена файлов, номера процессов и т. д.) и выполняет с ними некоторые манипуляции.

Однако утилита также может посмотреть стандартный поток вывода при наборе в терминале.

И, если она запускается без каких-либо параметров, то команда echo по умолчанию будет выполняться относительно всего набранного текста (завершение ввода выполняется нажатием Ctrl + d).

Вот общий синтаксис утилиты:

SOME_COMMANDS (необязательный параметр для работы программы), могут быть любые команды, которые передают некоторые данные через пайп на выводе.

Затем xargs выполняет для них операцию, указанную в качестве параметра.

По умолчанию данные вставляются в самом конце после имени операционной утилиты, но это можно изменить, указав фигурные скобки в том месте, куда их нужно вставить.

Ниже приведен список часто используемых параметров: заменяет символы пробела и перевода строки символом разделения NULL («\0»); хорошо сочетается с командой find
выполняет команду для каждой группы из заданного числа непустых строк аргументов, считанных из стандартного ввода; в отличие от -L, аргумент max-lines является необязательным указывает закрывающую пару символов (обычно используют <> или []), вместо которых данные, переданные слева, будут заменены для последующей операции выполняет команду, используя все аргументы чтения из стандартного ввода, число которых не превышает заданные максимальные аргументы включает режим интерактива: перед каждым запросом команды запрашивается подтверждение включает режим трассировки, показывая полное имя команды, выполняемой перед запуском в стандартном потоке ошибок

Примеры команды Xargs

Чаще всего утилита получает данные из find.

Несмотря на то, что последняя имеет возможность выполнять операции через exec, это довольно ограниченный и медленный способ работы со многими объектами.

Таким образом, большинство примеров будут связаны с командой find.

Стоит напомнить, что xargs не обрабатывает имена объектов, содержащих пробелы. Чтобы выйти из ситуации, используйте параметр -0.

Копирование файлов с помощью Xargs

Найдите все файлы с расширением .sh и в режиме трассировки скопируйте их в другой каталог.

Обычное использование xargs cp destination/ не поможет, так как по умолчанию эти файлы будут вставлены в конце этой команды, что означает, что будет предпринята попытка скопировать в них каталог /destination, что является абсурдом.

Следовательно, вы должны добавить опцию -I с помощью фигурных скобок, а затем указать в cp место, куда будут заменены скопированные файлы:

Читайте также: