Гид по технологиям

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

• 6 min read • Linux • Обновлено 30 Nov 2025
xargs в Linux: практическое руководство
xargs в Linux: практическое руководство

Xargs Feature

Обновлённый 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.

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

Xargs Find Cp

Обновлённый ALT: Пример копирования содержимого файла test0.txt в найденные файлы через xargs

Что произойдёт: доказательство

После выполнения команды все целевые .txt получат содержимое test0.txt.

Xargs Cp Proof

Обновлённый 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

Xargs Pdfs

Обновлённый ALT: Множество PDF-файлов в папке, готовые к удалению через xargs

Xargs Rm F

Обновлённый 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"

Вы получите номера строк и пути файлов, где найдена подстрока.

Xargs Grep Mte

Обновлённый 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 не вернул результатов.

Xargs Find Txt Pngs

Обновлённый 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.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро