Thank you for reading this post, don't forget to subscribe!
Утилита xargs позволяет создавать и выполнять команды из стандартного ввода.
Xargs обычно используется в сочетании с другими командами через конвейер. Использование xargs позволяет вам предоставлять стандартный ввод в качестве аргументов утилит командной строки, таких как mkdir и rm.
В этой статье мы рассмотрим основы использования команды xargs.
Как использовать команду xargs в Linux
Xargs читает аргументы из стандартного ввода, разделенные пробелами или символами новой строки, и выполняет указанную команду, используя входные данные в качестве аргументов команды. Если команда не указана, по умолчанию используется /bin/echo.
Синтаксис команды xargs следующий:
1 |
xargs [OPTIONS] [COMMAND [initial-arguments]] |
Самый простой пример использования xargs – передать несколько строк, разделенных пробелами, с помощью канала в xargs и запустить команду, которая будет использовать эти строки в качестве аргументов.
1 |
echo "file1 file2 file3" | xargs touch |
В приведенном выше примере мы передаем стандартный ввод в xargs, и команда touch запускается для каждого аргумента, создавая три файла. Это так же, как если бы вы запустили:
1 |
touch file1 file2 file3 |
Как просмотреть команду и запросить пользователя
Чтобы напечатать команду на терминале перед ее выполнением, используйте опцию -t( –verbose):
1 |
echo "file1 file2 file3" | xargs -t touch |
1 |
touch file1 file2 file3 |
Если вы хотите получить подсказку, следует ли запускать каждую команду перед ее выполнением, используйте параметр -p( –interactive):
1 |
echo "file1 file2 file3" | xargs -p touch |
Введите y или Y подтвердите и выполните команду:
1 |
touch file1 file2 file3 ?...y |
Этот переключатель полезен при выполнении деструктивных команд.
Как ограничить количество аргументов
По умолчанию количество аргументов, передаваемых команде, определяется системным пределом.
Опция -n( –max-args) указывает количество аргументов, передаваемых данной команде. Xargs будет запускать указанную команду столько раз, сколько потребуется, пока все аргументы не будут исчерпаны.
В следующем примере количество аргументов, считываемых из стандартного ввода, ограничено 1.
1 |
echo "file1 file2 file3" | xargs -n 1 -t touch |
Как вы можете видеть из подробного вывода ниже, сенсорная команда выполняется отдельно для каждого аргумента:
1 2 3 |
touch file1 touch file2 touch file3 |
Как запустить несколько команд
Чтобы запустить несколько команд с xargs, используйте опцию -I. Он работает путем определения replace-str после переключателя -I, а затем все вхождения replace-str заменяются аргументом, переданным в xargs.
В следующем примере xargs будут запущены две команды, сначала он создаст файлы с помощью touch, а затем выведет список файлов с помощью команды ls:
1 |
echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }' |
1 2 3 |
-rw-r--r-- 1 andreyex users 0 May 14 22:25 file1 -rw-r--r-- 1 andreyex users 0 May 14 22:25 file2 -rw-r--r-- 1 andreyex users 0 May 14 22:25 file3 |
Обычный выбор для replace-str %, однако, вы можете использовать другой заполнитель, например ARGS:
1 |
echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }' |
Как указать разделитель
Используйте параметр -d( –delimiter), чтобы установить пользовательский разделитель, который может быть либо одним символом, либо escape-последовательностью, начинающейся с \.
Следующий пример, который мы используем ; в качестве разделителя:
1 |
echo "file1;file2;file3" | xargs -d \; -t touch |
1 |
touch file1 file2 file3 |
Как читать элементы из файла
Команда xargs также может читать элементы из файла вместо стандартного ввода. Для этого используйте параметр -a( –arg-file), за которым следует имя файла.
В следующем примере команда xargs прочитает файл ips.txt и пингует каждый IP-адрес.
1 2 |
8.8.8.8 1.1.1.1 |
Мы также используем опцию -L, которая инструктирует xargs читать по одной строке за раз. Если эта опция не указана, xargs передает все IP-адреса одной команде ping.
1 |
xargs -t -L 1 -a ips.txt ping -c 1 |
1 2 3 4 5 6 7 8 |
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=45.2 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=14.3 ms |
Использование xargs с find
xargs чаще всего используется в сочетании с командой find. Вы можете использовать find для поиска определенных файлов, а затем использовать xargs для выполнения операций с этими файлами.
Чтобы избежать проблем с именами файлов, которые содержат символы новой строки или другие специальные символы, всегда используйте параметр поиска, -print0 который заставит find печатать полное имя файла, за которым следует нулевой символ. Этот вывод можно правильно интерпретировать с помощью xargs, используя опцию -0, ( –null).
В следующем примере команда find распечатает полные имена всех файлов в каталоге /var/www/.cache, а xargs передаст пути к файлам команде rm:
1 |
find /var/www/.cache -type f -print0 | xargs -0 rm -f |
Использование xargs для обрезки символов пробела
Xargs также можно использовать как инструмент для удаления пробелов с обеих сторон заданной строки. Просто передайте строку в команду xargs, и она выполнит обрезку:
1 |
echo " Длинная линия " | xargs |
1 |
Длинная линия |
Это может быть полезно при сравнении строк в сценариях оболочки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash VAR1=" andreyex " VAR2="andreyex" if [[ "$VAR1" == "$VAR2" ]]; then echo "Строки равны." else echo "Строки не равны." fi ## Using xargs to trim VAR1 if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then echo "Строки равны." else echo "Строки не равны." fi |
1 2 |
Строки не равны. Строки равны. |