xargs — это связующее звено между командами Linux.
Он берёт список файлов, строк или аргументов и передаёт их другой команде пакетами.
Идеален в связке с find, grep, sed, awk и tar.

Топ-15 полезных флагов xargs#

Флаг Назначение
-n N Передавать по N аргументов за один вызов
-P N Параллельный запуск N процессов
-I {} Шаблон для подстановки аргументов
-0 Безопасная работа с пробелами и спецсимволами (используется с find ... -print0)
-d Установить кастомный разделитель
-p Подтверждать каждое действие перед выполнением
-t Показать команду перед выполнением
-r Не запускать команду, если аргументов нет
-s N Ограничить максимальный размер команды
-L N Обрабатывать по N строк из ввода за раз
--max-procs=N Альтернатива -P, запускает процессы параллельно
-E str Установить слово, которое остановит ввод
-x Завершить выполнение, если команда превышает лимит
-0 -n 1 Лучший вариант для надёжной пакетной обработки
--show-limits Показать системные лимиты аргументов

🟢 Уровень 1 — Базовые команды (разогрев)#

echo "hello world" | xargs

  • Выводит hello world (по умолчанию xargs вызывает echo)

echo "a b c" | xargs -n 1

  • Выводит аргументы по одному на строку: a, b, c

cat list.txt | xargs

  • Склеивает содержимое list.txt в одну строку аргументов

ls | xargs echo Файл:

  • Добавляет префикс Файл: перед каждым именем

🟡 Уровень 2 — Работа с файлами#

ls *.txt | xargs rm

  • Удаляет все .txt файлы

find . -type f -name "*.log" | xargs wc -l

  • Считает количество строк во всех .log

ls *.png | xargs -I {} mv {} images/{}

  • Перемещает все .png в каталог images/

cat urls.txt | xargs wget

  • Скачивает все URL из urls.txt

find . -type f | xargs du -sh

  • Показывает размер каждого найденного файла

🟠 Уровень 3 — Гибкое управление аргументами#

echo "1 2 3 4" | xargs -n 2

  • Передаёт по 2 аргумента за один вызов

seq 1 10 | xargs -n 5

  • Выводит числа пачками по 5 штук

printf "a\nb\nc" | xargs -d '\n'

  • Использует перевод строки как разделитель

cat list.txt | xargs -I {} echo Файл: {}

  • Подставляет {} вместо каждого аргумента

find . -name "*.jpg" | xargs -p rm

  • Спрашивает подтверждение перед удалением

🔵 Уровень 4 — Совместно с find#

find . -type f -name "*.txt" | xargs cat

  • Склеивает содержимое всех .txt файлов

find . -name "*.jpg" | xargs -I {} cp {} /backup/{}

  • Копирует все .jpg в /backup/

find . -type f -print | xargs wc -l

  • Считает количество строк во всех файлах

find . -name "*.c" | xargs grep -H "main"

  • Ищет main во всех .c файлах

find . -type f -print0 | xargs -0 rm

  • Удаляет файлы с пробелами в именах безопасно

🟣 Уровень 5 — С grep, sed и awk#

grep -rl "ERROR" logs/ | xargs sed -i 's/ERROR/INFO/g'

  • Меняет ERRORINFO во всех найденных файлах

grep -rl "DEBUG" . | xargs rm

  • Удаляет все файлы, содержащие DEBUG

grep -rlZ "FIXME" . | xargs -0 sed -i 's/FIXME/DONE/g'

  • Безопасно заменяет FIXMEDONE

cat data.csv | xargs -n 1 echo

  • Выводит каждое значение CSV на новой строке

grep -rl "TODO" src/ | xargs wc -l

  • Считает количество строк в файлах с TODO

🔴 Уровень 6 — Мощные комбинации#

find . -type f -name "*.log" | xargs gzip

  • Сжимает все .log файлы

ls *.tar | xargs -n 1 tar -xf

  • Распаковывает все .tar архивы

find . -name "*.mp4" | xargs -n 1 -P 4 ffmpeg -i {} -vn {}.mp3

  • Конвертирует MP4 → MP3 в 4 потока

find . -name "*.jpg" | xargs -n 10 cp -t /backup/

  • Копирует по 10 файлов за раз

find . -type f | xargs md5sum

  • Считает хэши всех файлов

ls *.txt | xargs -I {} sh -c 'echo Обрабатываем {}; cat {}'

  • Выполняет несколько команд для каждого файла

Уровень 7 — Гуру-режим#

find . -type f -print0 | xargs -0 -n 1 -P 8 md5sum

  • Считает хэши файлов параллельно

ls *.zip | xargs -n 1 unzip -d extracted

  • Распаковывает все .zip файлы

find src/ -name "*.c" | xargs -I {} sh -c 'gcc {} -o {}.out'

  • Компилирует все .c файлы

cat files.txt | xargs -I {} sh -c 'mkdir -p $(dirname {}) && touch {}'

  • Создаёт структуру папок и файлов из списка

find . -type f -size +100M | xargs -I {} mv {} /mnt/large_files/

  • Перемещает файлы больше 100MB

find . -type f -name "*.bak" | xargs -n 50 rm

  • Удаляет .bak пакетами по 50 файлов