Утилита 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 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 ), чтобы установить пользовательский разделитель, который может быть либо одиночным символом, либо управляющей последовательностью, начинающейся с .
В следующем примере мы используем ; как разделитель:
echo "file1;file2;file3" | xargs -d ; -t touch
touch file1 file2 file3
Как читать элементы из файла
Команда xargs также может считывать элементы из файла вместо стандартного ввода. Для этого используйте параметр -a ( --arg-file ), за которым следует имя файла.
В следующем примере команда xargs будет читать файл ips.txt и ips.txt каждым IP-адресом.
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 строку команде 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, которая позволяет создавать и выполнять команды.
Добавить комментарий