🐧 Команда Xargs в Linux

by itisgood
В GNU / Linux есть много утилит, которые беспрецедентно мощные и полезные, но при этом не очень популярны.
К ним относится команда xargs.
Ее основное назначение – работа с выводом других команд терминала.
В этой статье описывается синтаксис этой утилиты, а также примеры как ее использовать.

Синтаксис и параметры команды Xargs

Xargs принимает исходящие данные других программ (это могут быть имена файлов, номера процессов и т. д.) и выполняет с ними некоторые манипуляции.

Однако утилита также может посмотреть стандартный поток вывода при наборе в терминале.

И, если она запускается без каких-либо параметров, то команда echo по умолчанию будет выполняться относительно всего набранного текста (завершение ввода выполняется нажатием Ctrl + d).

Вот общий синтаксис утилиты:

[SOME_COMMANDS |] xargs [params] [command [initial-argument]]
SOME_COMMANDS (необязательный параметр для работы программы), могут быть любые команды, которые передают некоторые данные через пайп на выводе.

Затем 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 – это пайплайн данных слева, используемый в утилите справа.

Примеры команды 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 находит все необходимые файлы, и 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

 

You may also like

Leave a Comment