Команда Xargs в Linux с примерами

Команда Xargs в Linux с примерами

13 Января 2020 | Терминал

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

Команда Xargs в Linux  с примерами

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

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


Как использовать xargs команду Linux

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

Синтаксис xargs команды следующий:

xargs [OPTIONS] [COMMAND [initial-arguments]]

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

echo "file1 file2 file3" | xargs touch

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

touch file1 file2 file3

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

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

echo  "file1 file2 file3" | xargs -t touch
touch file1 file2 file3


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

echo  "file1 file2 file3" | xargs -p touch


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

touch file1 file2 file3 ?...y


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


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

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

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

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

echo  "file1 file2 file3" |  xargs -n 1 -t touch


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

touch file1
touch file2
touch file3


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

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

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

echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
-rw-r--r-- 1 baks.dev users 0 May  6 11:54 file1
-rw-r--r-- 1 baks.dev users 0 May  6 11:54 file2
-rw-r--r-- 1 baks.dev users 0 May  6 11:54 file3


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

echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'


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

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

Следующий пример, который мы используем в качестве разделителя:

echo  "file1;file2;file3" | xargs -d \; -t touch

touch file1 file2 file3


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

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

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

ips.txt
8.8.8.8
1.1.1.1

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

xargs -t -L 1 -a ips.txt ping -c 1
ping -c 1 8.8.8.8 
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms

...
ping -c 1 1.1.1.1 
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms


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

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

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

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

find /var/www/.cache -type f -print0 | xargs -0 rm -f


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

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

echo "  Long line " | xargs
Long line


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

#!/bin/bash

VAR1=" Baksdev "
VAR2="Baksdev"

if [[ "$VAR1" == "$VAR2" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

## Using xargs to trim VAR1
if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

Strings are not equal.
Strings are equal.


Вывод 

xargs утилита командной строки в Linux, позволяющая создавать и выполнять команды

Для более подробной информации о каждом xargs опции, прочитайте справочную страницу xargs .

    Комментарии

    Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.

Загрузка комментариев...