Вики / Базовые команды
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 # по одному аргументу
См. также
- Базовые команды с файлами — Базовые команды
- grep (поиск по тексту) — Базовые команды
- find (поиск файлов) — Базовые команды