Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Команда Xargs для начинающих с примерами

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

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

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

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

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

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

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

$ touch file1 file2 file3 ?...y

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

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

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

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

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

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

Как вы можете видеть из подробного вывода ниже, команда 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 linuxize users 0 May  6 11:54 file1
-rw-r--r-- 1 linuxize users 0 May  6 11:54 file2
-rw-r--r-- 1 linuxize 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 для выполнения операций с этими файлами.

Чтобы избежать проблем с именами файлов, которые содержат символы новой строки или другие специальные символы, всегда используйте параметр find -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=" Linuxize "
VAR2="Linuxize"

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.

Заключение

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