Найти в Дзене
Linux | Network | DevOps

xargs — твоя суперсила в командной строке

Сегодня разберём утилиту, которая превращает тебя из начинающего в настоящего баш-мага — xargs. Если коротко: xargs берёт stdin → превращает в аргументы → запускает команды пачками, быстро и мощно. Пример: echo "file1 file2" | rm — не работает echo "file1 file2" | xargs rm — работает! ⭐️Основные фишки Массовое удаление: find . -name "*.tmp" | xargs rm Параллельная загрузка: xargs -P5 -n1 wget < urls.txt Работа с файлами с пробелами: find . -type f -print0 | xargs -0 -I{} mv '{}' /music/ 📂Сценарии, которые ты будешь использовать постоянно Поиск в куче файлов: find /project -name '*.py' -print0 | xargs -0 grep -nH 'import pandas' Архивирование найденного: find . -type f -name '*.js' -print0 | tar --null -czf backup.tar.gz -T - Массовое переименование: find . -name '*.jpg' -print0 | xargs -0 -I{} mv '{}' '{}'.backup ✅ Параллельная мощь Конвертация изображений (4 потока): find . -name '*.png' -print0 | xargs -0 -P4 -n1 -I{} convert '{}' '{}'.jpg Параллельные HTTP-запросы: xargs -P10 -n1

Сегодня разберём утилиту, которая превращает тебя из начинающего в настоящего баш-мага — xargs. Если коротко: xargs берёт stdin → превращает в аргументы → запускает команды пачками, быстро и мощно.

Пример:

echo "file1 file2" | rm — не работает

echo "file1 file2" | xargs rm — работает!

⭐️Основные фишки

Массовое удаление:

find . -name "*.tmp" | xargs rm

Параллельная загрузка:

xargs -P5 -n1 wget < urls.txt

Работа с файлами с пробелами:

find . -type f -print0 | xargs -0 -I{} mv '{}' /music/

📂Сценарии, которые ты будешь использовать постоянно

Поиск в куче файлов:

find /project -name '*.py' -print0 | xargs -0 grep -nH 'import pandas'

Архивирование найденного:

find . -type f -name '*.js' -print0 | tar --null -czf backup.tar.gz -T -

Массовое переименование:

find . -name '*.jpg' -print0 | xargs -0 -I{} mv '{}' '{}'.backup

✅ Параллельная мощь

Конвертация изображений (4 потока):

find . -name '*.png' -print0 | xargs -0 -P4 -n1 -I{} convert '{}' '{}'.jpg

Параллельные HTTP-запросы:

xargs -P10 -n1 curl -O < urls.txt

Бэкап нескольких БД:

printf '%s\n' db1 db2 db3 | xargs -n1 -P3 -I{} pg_dump -Fc -d "{}" -f "{}.dump"

⚙ Автоматизация

Запуск команд из файла:

xargs -L1 -I{} sh -c '{}' < commands.txt

Анализ логов с логированием:

find /var/log -name '*.log' -print0 \

| tee >(tr '\0' '\n' > files.list) \

| xargs -0 grep -H 'ERROR'

⚡️Безопасность (что не делать)

Очень опасно:

find / -name "*" | xargs rm -rf

Чувствительно к пробелам:

find . -name "My File.txt" | xargs r

✍️Как делать правильно

find . -name "*.log" | xargs -p rm — тестируй перед запуском

find . -name "*.txt" -print0 | xargs -0 rm — спасает от пробелов

xargs --show-limit — смотри лимиты системы

🔢Экстремальные примеры

Ресайз RAW-фото:

find . -name "*.RAW" -print0 | xargs -0 -P8 -I{} convert {} -resize 50% {}.jpg

Параллельный анализ логов:

find /logs -name "*.gz" -print0 | xargs -0 -P4 zcat | grep "500 ERROR"

📖 Шпаргалочка

cmd | xargs target_cmd # базовый синтаксис

cmd | xargs -P N -I{} cmd {} # параллель + подстановка

find ... -print0 | xargs -0 cmd # файлы с пробелами

cmd | xargs -n1 cmd # по одному аргументу

cmd | xargs -p cmd # подтверждение

cmd | xargs -L1 cmd # строка за раз

📁Золотые правила

🟢 Всегда тестируй опасные операции через -p

🟢При работе с файлами используй -print0 + -0

🟢-P N = параллелизм и ускорение

🟢-I{} = полный контроль подстановки

🟢Лучший друг xargs — find

xargs + find = суперспособности в терминале

Обрабатывай тысячи файлов, запускай команды параллельно, автоматизируй всё, что повторяется.

Обсудить эту статью можно в Телеграм канале: https://t.me/linautonet