Как и зачем использовать xargs в Linux

xargs — это утилита, которая преобразует стандартный ввод в список аргументов для другой команды. Она особенно полезна, когда одна команда выдаёт список (например, find), а другая команда принимает только аргументы, а не поток stdin.
Что делает xargs и зачем он нужен
xargs читает строки из stdin и вызывает указанную команду с этими аргументами. Если список аргументов становится слишком длинным для одного вызова команды, xargs автоматически разделит их на несколько вызовов, чтобы не превысить лимит длины командной строки.
Кратко:
- Принимает вывод одной команды и превращает его в аргументы для другой.
- Избегает ошибок “argument list too long” при большом числе файлов.
- Более эффективен по сравнению с многократным запуском процесса для каждой строки.
Базовый синтаксис
Простой шаблон команды:
xargs [опции] командаНапример, если у вас есть команда, выдающая список имён файлов, и вы хотите удалить их, можно написать:
find . -name '*.log' -print | xargs rmОднако этот вариант небезопасен для имён файлов с пробелами или спецсимволами. Лучше использовать нулевой разделитель:
find . -name '*.log' -print0 | xargs -0 rm --- -print0 у find выводит имена файлов, разделённые NUL (пустой байт).
- -0 у xargs читает NUL-разделённый ввод.
- – у rm завершает список опций и защищает от имён, начинающихся с “-“.
Частые варианты и полезные опции
- -0 — читать нулевой разделитель (совместно с find -print0)
- -n N — передавать не более N аргументов за один вызов
- -P N — запускать до N процессов параллельно (GNU xargs)
- -I {} — шаблон замены в команде (для позиционной подстановки)
- -r — не запускать команду, если нет ввода
Примеры:
# Безопасное удаление старых файлов (90 дней):
find /path/to/dir -mtime +90 -print0 | xargs -0 rm --
# Параллельное сжатие файлов (4 процесса):
find . -name '*.txt' -print0 | xargs -0 -P 4 -n 1 gzip
# Подстановка в середину команды:
ls | xargs -I {} echo File: {}Частые ошибки и когда xargs не подойдёт
- Имена файлов с переводом строки — если инструмент выводит имена с LF внутри, даже -print0/-0 решит проблему только при корректном использовании.
- Если команда сама ожидает stdin (не аргументы), xargs может быть не нужен.
- Некоторым задачам лучше подходит -exec … +: когда нужно точное управление местом подстановки и экранирования.
Пример альтернативы: find с -exec … +
# find вызывает rm группами, подобно xargs, но без промежуточной обработки stdin
find . -name '*.log' -exec rm -- {} +-exec … + обычно безопаснее по экранированию, но у него меньше гибкости для параллельного запуска и сложных шаблонов замены.
Альтернативы и расширения
- find -exec … + — встроенная альтернатива для групповых вызовов команд.
- GNU parallel — более мощная и гибкая замена, поддерживает параллелизм и подробный контроль.
- while read -r — цикл в оболочке для построчной обработки (полезно для кастомной логики).
Пример с while:
find . -name '*.sha1' -print0 | while IFS= read -r -d '' file; do
process "$file"
doneШпаргалка: команды и шаблоны
| Цель | Команда — пример |
|---|
| Безопасно удалить файлы с пробелами | find . -name “*.log” -print0 | xargs -0 rm – |
| Параллельно обработать файлы | find . -type f -print0 | xargs -0 -P 8 -n 1 gzip |
| Точная подстановка | echo a b c | xargs -I {} echo “item: {}” |
| Ограничить количество аргументов | ls | xargs -n 10 echo |
Рекомендации по безопасности и надёжности
Важно: команды вроде rm — потенциально опасны. Всегда сначала тестируйте команду с echo или с флагом –dry-run (если есть) и проверяйте вывод.
Проверочные приёмы:
- Замените команду на echo, чтобы увидеть, какие аргументы будут переданы: find … | xargs -0 echo
- Используйте -print0 и -0 для безопасной обработки имён с пробелами и спецсимволами.
- Добавляйте – для команд, которые могут принять опции из имён файлов.
Роль-based чек-лист (для администратора / разработчика)
- Системный администратор:
- Проверить резервные копии перед массовыми удалениями.
- Использовать -print0 и -0 для безопасности.
- Пробежать dry-run через echo.
- Девопс / CI-инженер:
- Использовать -P для ускорения обработки в параллельных задачах.
- Логировать ошибки и успешные выполнения.
- Разработчик:
- Для сложной фильтрации предпочесть скриптовый цикл с while read.
- Для массовой обработки больших наборов файлов рассмотреть GNU parallel.
Короткий пример: удалить файлы старше 90 дней (безопасно)
find /var/log/myapp -mtime +90 -type f -print0 | xargs -0 -r rm --Здесь -r предотвращает запуск rm, если список пуст.
Мини-глоссарий
- xargs — утилита для превращения stdin в аргументы командной строки.
- stdin — стандартный поток ввода (обычно ввод из предыдущей команды в конвейере).
- -print0 / -0 — использование NUL-байта как разделителя для безопасной передачи имён файлов.
- -exec … + — опция find, которая группирует аргументы и вызывает команду эффективнее, чем -exec … ;
Краткое резюме
xargs — простой и мощный инструмент для передачи результатов одной команды в другую через аргументы. Он помогает обходить ограничение длины списка аргументов и эффективнее обрабатывать файлы, особенно вместе с find. Всегда проверяйте команды перед удалением и используйте нулевые разделители для безопасной обработки имён с пробелами.
Примечание: если вам нужен параллелизм и более гибкая обработка, рассмотрите GNU parallel. Если вам важна простота и безопасность экранирования — используйте find -exec … +.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента