Введение
Утилита xargs
позволяет создавать и выполнять команды из стандартного ввода.
xargs
обычно используется в сочетании с другими передаваемыми по конвейеру командами. С помощью xargs
вы можете предоставлять стандартный ввод в качестве аргументов утилитам командной строки, таким как mkdir
и rm
.
В этом уроке мы рассмотрим основы использования команды xargs
.
Как использовать команду Xargs
xargs
читает аргументы из стандартного ввода, разделенные пробелом или новой строкой, и выполняет указанную команду, используя ввод в качестве аргументов команды. Если команда не указана, по умолчанию используется /bin/echo
.
Синтаксис команды xargs
следующий:
xargs [OPTIONS] [COMMAND [initial-arguments]]
Самым простым примером использования команды 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 noviello users 0 Oct 16 01:52 file1
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file2
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file3
Обычно для replace-str
используется %
, однако вы можете использовать другой заполнитель, например ARGS
:
echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'
Как указать разделитель
Используйте параметр -d
( --delimiter
) для установки пользовательского разделителя, который может быть одиночным символом или управляющей последовательностью, начинающейся с \
.
В следующем примере мы используем ;
как разделитель:
echo "file1;file2;file3" | xargs -d \; -t touch
touch file1 file2 file3
Как прочитать элементы из файла
Команда xargs
также может считывать элементы из файла, а не из стандартного ввода. Для этого используйте параметр -a
( --arg-file
), за которым следует имя файла.
В следующем примере команда xargs
прочитает файл ips.txt
и пропингует каждый IP-адрес.
8.8.8.8
1.1.1.1
Мы также используем параметр -L 1
, который указывает команде 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 с поиском
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=" Noviello "
VAR2="Noviello"
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
введите следующую команду:
manx xargs