Как пользоваться xargs в Linux — практическое руководство

Обновлённый ALT: Функции xargs: терминал с командами и списком файлов
Что такое xargs?
xargs — это утилита командной строки, которая читает элементы из стандартного ввода и выполняет другую команду, подставляя прочитанные элементы в виде аргументов. Это мост между командами: первая команда генерирует список (например, find), вторая обрабатывает этот список (rm, cp, mv, grep и т.д.).
Определение в одну строку: xargs превращает поток текста в аргументы для команды.
Ключевые опции (коротко):
- -n N — выполнять команду с не более чем N аргументами за раз.
- -I repl — заменить шаблон repl в командной строке на каждый входной элемент.
- -0 / –null — ожидать разделитель нулевой байт (в паре с -print0 у find).
- -r / –no-run-if-empty — не запускать команду, если нет входа.
Простой пример: запустить ls для папки
Простейший пример, который демонстрирует идею:
echo "Documents" | xargs lsПайп | передаёт строку “Documents” в xargs, который затем выполняет ls Documents.

Обновлённый ALT: Результат команды ls, выполненной через xargs для папки Documents
Часто используемая связка: find + xargs
xargs особенно полезен в паре с find. find собирает пути, xargs даёт им команду. Ниже — реальные случаи и лучшие практики.
Копирование содержимого в много файлов
Задача: взять содержимое файла reference (например, test0.txt) и скопировать его в множество других .txt файлов.
Ниже команда, которая выполняет эту задачу построчно:
find ./test-dir1/ -name "*.txt" | xargs -n1 cp test0.txtРазбор:
- find ./test-dir1/ -name “*.txt” — ищет все .txt в test-dir1;
- xargs -n1 cp test0.txt — для каждого найденного имени по одному (-n1) вызовет cp test0.txt <имя-целевого-файла>.
Важно: если имена файлов содержат пробелы или специальные символы, используйте -print0 и xargs -0:
find ./test-dir1/ -name "*.txt" -print0 | xargs -0 -n1 cp test0.txt
Обновлённый ALT: Пример копирования содержимого файла test0.txt в найденные файлы через xargs
Что произойдёт: доказательство
После выполнения команды все целевые .txt получат содержимое test0.txt.

Обновлённый ALT: Скриншот, показывающий одинаковое содержимое у нескольких .txt после копирования
Удаление большого количества файлов (когда rm выдаёт “Argument list too long”)
Проблема: rm может упереться в ограничение длины аргументов (ENAMETOOLONG) при большом количестве файлов. xargs решает это, разбивая список.
Пример: удалить все PDF в каталоге test-dir2:
find ./test-dir2/ -type f -name "*.pdf" -print | xargs rm -fБезопаснее (учтёт пробелы в именах):
find ./test-dir2/ -type f -name "*.pdf" -print0 | xargs -0 rm -f
Обновлённый ALT: Множество PDF-файлов в папке, готовые к удалению через xargs

Обновлённый ALT: Результат удаления PDF-файлов при помощи xargs и rm
Важно: будьте осторожны с rm и массовыми операциями. Всегда тестируйте с echo или ls перед реальным удалением:
find . -name "*.pdf" -print0 | xargs -0 echo rm -fПоиск по содержимому: find + xargs + grep
Чтобы найти все .txt файлы, содержащие строку “maketecheasier”:
find . -name "*.txt" -print | xargs grep "maketecheasier"С учётом пробелов/спецсимволов:
find . -name "*.txt" -print0 | xargs -0 grep --line-number "maketecheasier"Вы получите номера строк и пути файлов, где найдена подстрока.

Обновлённый ALT: Вывод grep с указанием файлов и номеров строк, найденных через xargs
Перемещение (cut/copy) файлов с заменой шаблона
Переместить все .txt старше 10 минут в родительскую папку:
find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../Здесь xargs заменяет ‘{}’ на каждое имя файла. Альтернатива с другим маркером:
find . -name "*.txt" -mmin +10 | xargs -n1 -I file mv file ./practiceЗамечание: -I вызывает отдельный процесс mv для каждого файла. Для больших списков это может быть медленнее, чем группировка с -n.
Как заставить xargs не запускать команду при пустом вводе
По умолчанию поведение зависит от реализации xargs. Универсальный способ — явно указать опцию -r:
find . -name "*.txt" | xargs -r ls -l-s Эта команда не выполнит ls, если find не вернул результатов.

Обновлённый ALT: Показанный пример, где в каталоге нет .txt, и xargs не запускает ls с опцией -r
Когда xargs не подходит — контрпримеры и альтернативы
- Имена файлов с пробелами/новыми строками: используйте -print0 и xargs -0 или find -exec … {} +.
- Параллельное выполнение: рассмотрите GNU parallel для одновременной обработки нескольких задач.
- Сложные подстановки в середине команды: find -exec CMD {} \; или -exec CMD {} + может быть понятнее.
- Если нужно одноразово выполнить команду для каждого результата и важна атомарность/порядок — используйте цикл shell (while read) или -I.
Сравнение в двух пунктах:
- xargs быстрее при групповой передаче аргументов (меньше вызовов команды).
- find -exec … {} + эквивалентен xargs по эффективности, но встроен в find.
Безопасность и лучшие практики
- Всегда тестируйте команды с echo или ls вместо rm/mv/cp при первой проверке.
- Для имён с пробелами и спецсимволами применяйте -print0 и xargs -0.
- Будьте внимательны с правами: массовые удаления и перезаписи файлам безопасно выполнять под учётной записью с минимальными правами.
- Никогда не прокладывайте необработанный вывод в оболочку через eval, если он может содержать символы или управляющие последовательности.
Полезная шпаргалка (cheat sheet)
- Базовый вызов: echo “a b c” | xargs cmd — выполнит cmd a b c
- По одному аргументу: xargs -n1 cmd
- Подстановка шаблона: xargs -I ‘{}’ cmd ‘{}’ –option
- Без запуска при пустом вводе: xargs -r
- Для нулевого разделителя (безопасно): find … -print0 | xargs -0 cmd
Роли и чеклист для работы с xargs
Для разработчика:
- Проверить имена файлов на пробелы.
- Тестировать команду с echo перед выполнением.
Для системного администратора:
- Использовать -print0 / -0 при массовых операциях.
- Контролировать права и журнал действий.
Для новичка:
- Начинать с простых примеров: echo | xargs ls
- Всегда делайте dry-run (echo) перед реальными операциями.
Краткий глоссарий
- STDIN — стандартный ввод, поток данных, который читают команды.
- -n — ограничение количества аргументов за один вызов команды.
- -I — строка-заменитель для подстановки имени элемента.
- -0 / -print0 — способ безопасной передачи имён с любыми символами.
Частые ошибки и как их избежать
- Ошибка: потеря файлов из-за пробелов в именах. Решение: -print0 | xargs -0.
- Ошибка: запуск команды при пустом вводе. Решение: добавить -r.
- Ошибка: слишком много процессов при использовании -I для тысяч файлов. Решение: использовать группировку (-n) или find -exec {} +.
FAQ
Можно ли параллелить выполнение с xargs?
Да, xargs поддерживает опцию -P N (GNU xargs) для запуска N параллельных процессов: find … | xargs -P4 -n1 cmd. Учтите риски конкурентного доступа к файлам.
Чем xargs лучше find -exec?
xargs эффективнее при передаче большого количества аргументов в один процесс и удобнее для группировки. find -exec {} + даёт похожую эффективность и проще в некоторых сценариях.
Как обработать имена файлов с новыми строками внутри?
Надёжнее всего использовать -print0 у find и xargs -0, потому что они используют нулевой байт как разделитель.
Заключение
xargs — гибкий и мощный инструмент для связывания команд в Unix/Linux. Он экономит ресурсы и помогает обходить ограничения оболочки по длине аргументов. Для безопасной работы помните о -0 / -print0, тестовом запуске через echo и опции -r. В большинстве реальных задач find + xargs ускоряет повторяющиеся операции и упрощает сценарии управления файлами.
Если вы нашли руководство полезным, посмотрите наши другие статьи по Linux: как исправить ошибку “no space left on device” и как ускорить Ubuntu.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента