TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #175 5.65K
Автоматизация задач с xargs

Многие пользователи Linux никогда не слышали о команде xargs, хотя это мощный инструмент для автоматизации задач и запуска команд с разными аргументами.

Утилита обрабатывает входные данные из стандартного потока ввода (STDIN). Они могут туда поступать либо напрямую от пользователя либо от сторонних команд через конвейер '|'.

Рассмотрим простой пример. Предположим, вы находитесь в каталоге с тремя файлами:


$ ls -1
file1.txt
file2.txt
file3.txt


Передадим данный список в xargs, чтобы он служил входными данными, и "wc -l" в качестве шаблона команды:


$ ls -1 | xargs wc -l
3 file1.txt
4 file2.txt
1 file3.txt
8 total


В результате xargs применил шаблон команды "wc -l" к каждому файлу для подсчета строк.

Недостаток примера заключается в том, что xargs тут-то и не требуется, можно обойтись сопоставлением файлов с шаблоном:


$ wc -l *
3 file1.txt
4 file2.txt
...


Зачем тогда использовать xargs?

Ее мощь становится очевидной, когда входные строки немного сложнее.

Предположим, вы хотите обойти дерево каталогов и посчитать количество строк во всех python скриптах с именами, оканчивающимися на ".py".

Такой список путей к файлам легко создать с помощью команды find:


$ find . -type f -name \*.py -print

/usr/lib/bup/bup/options.py
/usr/lib/bup/bup/xstat.py
...


Теперь xargs может применить шаблон команды к каждому файлу:


$ find / -type f -name \*.py -print | xargs wc -l

292 /usr/lib/bup/bup/options.py
112 /usr/lib/bup/bup/xstat.py
...


Комбинируя find и xargs, можно дать возможность любой команде выполняться с обходом всей файловой системы, затрагивая только те ресурсы, которые соответствуют критериям.

Команда xargs имеет множество опций. Рассмотрим наиболее интересные "-n", "-I" и "-0".

1. Параметр "-n" указывает то количество аргументов, которое будет передано на 1 выполнение команды:


$ ls | xargs echo
file1.txt file2.txt

$ ls | xargs -n1 echo
file1.txt
file2.txt


Во втором случае, команда echo выполнится 2 раза - по вызову на аргумент.

2. Параметр "-I" определяет место входных строк в команде. По умолчанию они добавляются в конец, но вы можете настроить их отображение в другом месте.

После "-I" введите любую строку, и она станет прототипом, указывающим, куда следует вставлять аргументы:


$ ls | xargs -I XYZ echo XYZ is OK
file1.txt is OK
file2.txt is OK


Обратите внимание, что "-I" ограничивает xargs одной входной строкой на команду.

Это значит, что если входной поток передается "сплошняком", его нужно разбить на строки, чтобы подстановка отработала для каждого элемента, иначе весь поток будет служить аргументом.

3. Параметр "-0" использует символ "\0" в качестве разделителя данных, вместо "\n" или пробела.

Часто используется при объединении find и xargs, т.к., обычно xargs ожидает, что строки будут разделены пробелами.

А если отдельные элементы в строках содержат дополнительные пробелы, например имена файлов?

По умолчанию команда будет рассматривать их как разделители ввода и, в результате, передавать неполные строки команде в качестве аргументов.

Например, если входные данные включают "file num 1.txt", xargs обработает все по отдельности и, вероятно, выведет ошибку:


$ find ./ -type f -name \*.txt -print | xargs wc -l

wc: ./file: No such file or directory
wc: num: No such file or directory
wc: 1.txt: No such file or directory


Как разделить входные строки нулями вместо символов новой строки? К счастью, у команды find есть возможность сделать это с помощью флага "-print0":


$ find ./ -name \*.txt -print0

./file1.txt./file num 1.txt


Теперь xargs будет искать разделитель "\0" и по нему сформирует корректный список аргументов для "wc -l":


$ find ./ -name \*.txt -print0 | xargs -0 wc -l

0 ./file1.txt
0 ./file num 1.txt
0 total


LinuxCamp
  • 👍 52
  • 🔥 14
  • ❤‍🔥 6
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →