linux-labs

Вики / Базовые команды

xargs (вход в аргументы)

Превратить поток строк в аргументы команды; безопасная обработка имён с пробелами.

xargs берёт строки со stdin и подставляет их как аргументы команды. Нужен, когда команда не читает stdin, а ждёт аргументы (как rm, chmod).

echo "a b c" | xargs touch        # создаст файлы a, b, c
find . -name '*.tmp' | xargs rm   # удалить найденное

Пробелы и переводы строк в именах ломают наивный xargs. Правильно — через нулевой разделитель:

find . -name '*.log' -print0 | xargs -0 rm        # -print0 + -0
grep -rlZ "TODO" . | xargs -0 sed -i 's/TODO/DONE/g'   # -Z у grep + -0 у xargs
Ключ Значение
-0 вход разделён NUL (с find -print0/grep -Z)
-n N по N аргументов за вызов
-I {} подстановка {} в произвольное место (по одному)
-P N параллельно в N процессов
-r не запускать на пустом вводе (--no-run-if-empty)
-t печатать команду перед запуском (отладка)
-a FILE читать аргументы из файла
-d '\n' задать разделитель явно
... | xargs -n1 cmd               # по одному аргументу за вызов
... | xargs -I{} cp {} /backup/   # подстановка {} (часто -I подразумевает -n1)
... | xargs -P4 -n1 cmd           # параллельно в 4 процесса
cat urls.txt | xargs -P8 -I{} curl -sO {}   # качать 8 в параллель
... | xargs -rt cmd               # не на пустом + показать команду

Имена с пробелами разрезаются

find ... -print0 | xargs -0 (или find -exec cmd {} +, см. find).

xargs запустился на пустом вводе и наделал бед

Добавь -r (--no-run-if-empty) — не запускать команду без аргументов.

«Argument list too long» / один вызов с тьмой аргументов

xargs сам бьёт на партии (лимит системы); для контроля — -n N. Альтернатива — find -exec cmd {} + (тоже группирует).

Нужно вставить аргумент не в конец

xargs -I{} cmd ... {} ...{} подставится в указанное место (по одному вызову).

Параллельный вывод перемешивается

При -P строки разных процессов чередуются. Логируй в отдельные файлы или используй GNU parallel (он умеет упорядочивать вывод).

find . -name '*.x' -print0 | xargs -0 rm     # безопасно (пробелы)
... | xargs -I{} cp {} /dst/                  # подстановка {}
... | xargs -P4 -n1 cmd                        # параллельно
... | xargs -rt cmd                            # не на пустом + показать
... | xargs -n1                                # по одному аргументу

См. также