Синтаксис и параметры команды Xargs
Xargs принимает исходящие данные других программ (это могут быть имена файлов, номера процессов и т. д.) и выполняет с ними некоторые манипуляции.
Однако утилита также может посмотреть стандартный поток вывода при наборе в терминале.
И, если она запускается без каких-либо параметров, то команда echo по умолчанию будет выполняться относительно всего набранного текста (завершение ввода выполняется нажатием Ctrl + d).
Вот общий синтаксис утилиты:
[SOME_COMMANDS |] xargs [params] [command [initial-argument]]
Затем xargs выполняет для них операцию, указанную в качестве параметра.
По умолчанию данные вставляются в самом конце после имени операционной утилиты, но это можно изменить, указав фигурные скобки в том месте, куда их нужно вставить.
Короткая (BSD) форма
|
Длинная (GNU) форма
|
Значение |
-0 | –null |
заменяет символы пробела и перевода строки символом разделения NULL («\0»); хорошо сочетается с командой find
|
-l [max-lines] | –maxlines[=max-lines] |
выполняет команду для каждой группы из заданного числа непустых строк аргументов, считанных из стандартного ввода; в отличие от -L, аргумент max-lines является необязательным
|
-I replace |
указывает закрывающую пару символов (обычно используют {} или []), вместо которых данные, переданные слева, будут заменены для последующей операции
|
|
-n max-args | –max-args=max-args |
выполняет команду, используя все аргументы чтения из стандартного ввода, число которых не превышает заданные максимальные аргументы
|
-p | –interactive |
включает режим интерактива: перед каждым запросом команды запрашивается подтверждение
|
-r | –no-run-if-empty |
не вызывает утилиту, если список ввода пуст
|
-t | –verbose |
включает режим трассировки, показывая полное имя команды, выполняемой перед запуском в стандартном потоке ошибок
|
Примеры команды Xargs
Чаще всего утилита получает данные из find.
Несмотря на то, что последняя имеет возможность выполнять операции через exec, это довольно ограниченный и медленный способ работы со многими объектами.
Таким образом, большинство примеров будут связаны с командой find.
Стоит напомнить, что xargs не обрабатывает имена объектов, содержащих пробелы. Чтобы выйти из ситуации, используйте параметр -0.
Копирование файлов с помощью Xargs
Найдите все файлы с расширением .sh и в режиме трассировки скопируйте их в другой каталог.
Обычное использование xargs cp destination/ не поможет, так как по умолчанию эти файлы будут вставлены в конце этой команды, что означает, что будет предпринята попытка скопировать в них каталог /destination, что является абсурдом.
Следовательно, вы должны добавить опцию -I с помощью фигурных скобок, а затем указать в cp место, куда будут заменены скопированные файлы:
find . -name "*.sh" | xargs --verbose -I {} cp {} scripts/
Вывод столбца
Вы можете отображать исходящие данные в нескольких столбцах.
Для этого используйте опцию -n:
ls | xargs -n 2 | column -t
Архивирование и сжатие файлов с помощью команды Xargs
find . -name “*.sh” | xargs tar jcf sh.tar.bz
Удалить старые файлы
Более сложная операция, которая удаляет объекты, например, в каталоге ~/tmp, если они были созданы 7 дней назад или старше:
find ~/tmp -type f -name ‘*’ -mtime +7 -print0 | xargs -0 rm -f
Блоки IP адресов
Очень удобная операция, позволяющая блокировать пул IP, например, из файла:
cat ip_blacklist | xargs -I IP iptables -A INPUT -s IP -j DROP
Удаление старых пакетов ядра
Полезная операция, когда уже накоплено много неиспользованных пакетов ядра (применимо к системам на основе Debian и Ubuntu):
dpkg -l linux-* | gawk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt -y purge