Когда в shell нужно обработать много файлов, хостов или строк, первый импульс обычно такой: написать for-цикл. Рабочий подход, но не всегда самый быстрый и удобный. Во многих таких задачах лучше использовать
xargs - утилиту, которая берет поток данных из stdin и превращает его в аргументы для другой команды.Проще говоря: нашли список объектов -> передали их в xargs -> массово обработали одной командой
▪️ Самый базовый пример:
cat hosts.txt | xargs ping -c 1
Но тут сразу важный нюанс: далеко не каждая команда умеет принимать много аргументов в таком виде. Поэтому на практике чаще используют
-I или -n.Например, пинговать хосты по одному:
cat hosts.txt | xargs -n1 ping -c 1
Здесь
-n1 говорит: передавать по одному аргументу на запуск.▪️ Полезный сценарий - массовая работа с файлами:
find /var/log -name "*.gz" | xargs rm -f
Но тут уже есть подводный камень: пробелы в именах файлов.
Безопасный вариант:
find /var/log -name "*.gz" -print0 | xargs -0 rm -f
Связка
-print0 и xargs -0 - это почти обязательная привычка, если работаете с файлами.▪️ Где xargs особенно хорош:
удаление и перемещение больших списков файлов;
массовый grep, chmod, chown;
обработка списков IP, URL, доменов;
запуск команд по данным из файла;
параллельное выполнение задач.
Например, проверить доступность списка хостов:
cat hosts.txt | xargs -n1 -P4 ping -c 1
-n1 - один хост на запуск-P4 - до 4 процессов параллельноВот здесь xargs уже реально ускоряет работу. Особенно на больших списках, где последовательная обработка была бы слишком долгой.
▪️ Еще полезные примеры. Искать строку во множестве файлов:
find /etc -type f -name "*.conf" -print0 | xargs -0 grep -H "listen"
Или массово смотреть размер файлов:
find /backup -type f -print0 | xargs -0 du -h
Когда нужен шаблон с явной подстановкой, используют -I:
cat users.txt | xargs -I{} id {}
Здесь
{} - место, куда подставляется значение из stdin.▪️ Что полезно запомнить:
-n1 - по одному аргументу за запуск-P4 - параллелить выполнение-0 - безопасно работать с пробелами и спецсимволами-I{} - явная подстановка значения в команду#linux #xargs
🧑💻 NetworkAdmin