
Утилита xargs позволяет формировать и выполнять команды из стандартного ввода. Обычно она используется в сочетании с другими командами через конвейер.
С помощью xargs вы можете предоставить стандартный ввод в качестве аргумента утилитам командной строки, таким как mkdir и rm .
В этом уроке мы рассмотрим основы использования команды xargs .
Как использовать команду 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
Введите 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 и выполнит ping для каждого 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.
Заключение
xargs — это утилита командной строки в Linux, которая позволяет создавать и выполнять команды.
Более подробную информацию о каждом параметре xargs можно найти на странице руководства xargs .
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства