WikiDer > Xargs
Разработчики) | Разные Открытый исходный код и коммерческий Разработчики |
---|---|
Операционная система | Unix, Unix-подобный, IBM i |
Платформа | Кроссплатформенность |
Тип | Команда |
xargs (сокращение от "расширенные ARGuments" [1]) это команда на Unix и большинство Unix-подобный операционные системы используется для создания и выполнения команд из стандартный ввод. Он преобразует ввод из стандартного ввода в аргументы команды.
Некоторые команды, такие как grep
и awk
может принимать ввод либо как аргументы командной строки, либо из стандартного ввода. Однако другие, такие как cp
и эхо
может принимать только входные данные в качестве аргументов, поэтому xargs необходимо.
В xargs команда также была перенесена в IBM i Операционная система.[2]
Примеры
Один вариант использования xargs команда - удалить список файлов с помощью rm команда. Системы POSIX имеют ARG_MAX для максимальной общей длины командной строки,[3][4] поэтому команда может завершиться ошибкой с сообщением об ошибке «Список аргументов слишком длинный» (это означает, что ограничение системного вызова exec на длину командной строки было превышено): rm / путь / *
или же rm $(find / path -type f)
. (Последний вызов неверен, так как он может расширять глобусы в выводе.)
Это можно переписать, используя xargs
команда, чтобы разбить список аргументов на подсписки, достаточно маленькие, чтобы быть приемлемыми:
find / path -type f -print | xargs rm
В приведенном выше примере найти
полезность питает ввод xargs
с длинным списком имен файлов. xargs
затем разбивает этот список на подсписки и вызывает rm
один раз для каждого подсписка.
xargs также может использоваться для распараллеливания операций с -P maxprocs
аргумент, чтобы указать, сколько параллельных процессов следует использовать для выполнения команд над списками входных аргументов. Однако выходные потоки могут не синхронизироваться. Это можно преодолеть, используя --выходной файл
аргумент, где это возможно, а затем объединение результатов после обработки. Следующий пример ставит в очередь 24 процесса и ожидает завершения каждого перед запуском другого.
найти / путь-имя '* .foo' | xargs -P 24 -Я '{}' / cpu / bound / процесс '{}' -о '{}'.из
xargs часто охватывает те же функции, что и подстановка команд особенность многих снаряды, обозначенный обратная цитата обозначение (`...` или же $(...)). xargs также является хорошим помощником для команд, выводящих длинные списки файлов, таких как найти
, найти
и grep
, но только если использовать -0
(или эквивалентно --ноль
), поскольку xargs
без -0
плохо справляется с именами файлов, содержащими ', " и космос. GNU Parallel похожий инструмент, который предлагает лучшую совместимость с найти, найти и grep когда имена файлов могут содержать ', ", и пробел (для новой строки по-прежнему требуется -0
).
Размещение аргументов
-I вариант: единственный аргумент
В xargs Команда предлагает варианты для вставки перечисленных аргументов в любую позицию, отличную от конца командной строки. В -Я возможность xargs принимает строку, которая будет заменена предоставленным вводом перед выполнением команды. Обычный выбор %.
$ mkdir ~ / резервные копии$ найти / путь -тип f -имя '*~' -print0 | xargs -0 -I% cp -a% ~ / резервные копии
Заменяемая строка может появляться в командной части несколько раз. С помощью -Я at all ограничивает количество используемых строк до одной.
Трюк со снарядом: любой номер
Другой способ добиться аналогичного эффекта - использовать оболочку в качестве запущенной команды и справиться со сложностью этой оболочки, например:
$ mkdir ~ / резервные копии$ найти / путь -тип f -имя '*~' -print0 | xargs -0 sh -c 'для имени файла; сделать cp -a "$ filename" ~ / backups; сделано' ш
Слово ш
в конце строки для Оболочка POSIX sh -c
заполнить для $0
, часть позиционных параметров (argv) «имя исполняемого файла». Если бы его не было, имя первого совпавшего файла было бы вместо этого присвоено $0
и файл не будет скопирован в ~ / резервные копии
. Можно также использовать любое другое слово, чтобы заполнить этот пробел, мой-xargs-скрипт
Например.
С cp
принимает несколько файлов одновременно, можно также просто сделать следующее:
$ найти / путь -тип f -имя '*~' -print0 | xargs -0 sh -c 'если [$ # -gt 0]; затем cp -a "$ @" ~ / backup; fi ' ш
Этот скрипт запускается cp
со всеми переданными ему файлами при передаче каких-либо аргументов. Это более эффективно, так как только один вызов cp
выполняется для каждого вызова ш
.
Проблема с разделителем
Многие утилиты Unix ориентированы на линию. Они могут работать с xargs
пока строки не содержат '
, "
, или пробел. Некоторые из утилит Unix могут использовать NUL как разделитель записей (например, Perl (требует -0
и \0
вместо п
), найти
(требует использования -0
), найти
(требует использования -print0
), grep
(требует -z
или же -Z
), Сортировать
(требует использования -z
)). С помощью -0
за xargs
решает проблему, но многие утилиты Unix не могут использовать NUL в качестве разделителя (например, голова
, хвост
, ls
, эхо
, sed
, деготь -v
, Туалет
, который
).
Но часто люди забывают об этом и предполагают xargs
также ориентирован на линии, что нет корпус (по умолчанию xargs
разделяется на новые строки и пробелы внутри строк, подстроки с пробелами должны заключаться в одинарные или двойные кавычки).
Проблема разделителя проиллюстрирована здесь:
# Сделайте несколько целей для практикиtouch important_filetouch 'не важный_файл'mkdir -p '12 "записей"найти . -имя не\* | хвост -1 | xargs rmfind \! -имя . -тип d | хвост -1 | xargs rmdir
Выполнение вышеуказанного вызовет важный_файл
будет удален, но не удалит ни каталог с именем 12 "пластинок
, ни файл с именем not important_file
.
Правильное исправление - использовать специфичный для GNU -print0
вариант, но хвост
(и другие инструменты) не поддерживают строки с завершающим NUL:
# используйте те же команды подготовки, что и вышенайти . -имя не\* -print0 | xargs -0 rmfind \! -имя . -type d -print0 | xargs -0 rmdir
При использовании -print0
опции, записи разделяются нулевым символом вместо конца строки. Это эквивалентно более подробной команде:найти . -имя не\* | tr \\п \\0 | xargs -0 пог.
или короче, переключая xargs
в (не POSIX) линейно-ориентированный режим с -d
(разделитель) вариант: найти . -имя не\* | xargs -d ' n' rm
но в целом используя -0
с -print0
следует предпочесть, поскольку новые строки в именах файлов все еще остаются проблемой.
GNU параллельно
это альтернатива xargs
который имеет те же параметры, но ориентирован на линии. Таким образом, используя вместо этого GNU Parallel, все вышесказанное будет работать должным образом.[5]
Для сред Unix, где xargs
не поддерживает -0
ни -d
(например, Solaris, AIX), стандарт POSIX утверждает, что можно просто экранировать каждый символ с помощью обратной косой черты:найти . -имя не\* | sed 's / (. ) / 1 / g' | xargs rm
.[6] В качестве альтернативы можно вообще избежать использования xargs, либо используя GNU parallel, либо используя -exec ... +
функциональность найти
.
Работа с подмножеством аргументов за раз
Можно иметь дело с командами, которые могут принимать только один или, может быть, два аргумента за раз. Например, разница
команда работает с двумя файлами одновременно. В -n
возможность xargs
указывает, сколько аргументов одновременно передавать данной команде. Команда будет вызываться повторно, пока не будут исчерпаны все входные данные. Обратите внимание, что при последнем вызове можно получить меньше аргументов, чем желаемое, если входных данных недостаточно. Использовать xargs
чтобы разбить ввод на два аргумента в каждой строке:
$ эхо {0..9} | xargs -n 20 12 34 56 78 9
В дополнение к запуску на основе указанного количества аргументов за раз, можно также вызвать команду для каждой строки ввода с -L 1
вариант. Одновременно можно использовать произвольное количество строк, но чаще всего используется одна. Вот как можно разница
каждый git совершает против своего родителя.[7]
$ git log --format=«% H% P» | xargs -L 1 git diff
Проблема с кодировкой
Обработка разделителя аргументов xargs
это не единственная проблема с использованием xargs
программа в режиме по умолчанию. Большинство инструментов Unix, которые часто используются для управления именами файлов (например, sed
, базовое имя
, Сортировать
и т. д.) являются инструментами обработки текста. Однако имена путей Unix на самом деле не являются текстом. Рассмотрим путь / aaa / bbb / ccc. Каталог / aaa и его подкаталог bbb, как правило, могут создаваться разными пользователями в разных средах. Это означает, что у этих пользователей могут быть разные настройки локали, а это означает, что aaa и bbb даже не обязательно должны иметь одинаковую кодировку символов. Например, aaa может быть в UTF-8 и bbb в Shift JIS. В результате абсолютный путь в системе Unix может некорректно обрабатываться как текст в односимвольной кодировке. Инструменты, которые полагаются на ввод текста, могут не работать с такими строками.
Одним из способов решения этой проблемы является запуск таких инструментов в локали C, которая по существу обрабатывает байты входных данных как есть. Однако это изменит поведение инструментов неожиданным для пользователя образом (например, некоторые ожидания пользователя в отношении поведения сворачивания регистра могут не оправдаться).
Рекомендации
- ^ «Список сокращений Unix: полный список». www.roesler-ac.de. Получено 2020-04-12.
- ^ IBM. "Qshell для программирования IBM System i версии 7.2" (PDF). Получено 2020-09-05.
- ^ «Часто задаваемые вопросы об основных утилитах GNU». Получено 7 декабря, 2015.
- ^ «Максимальная длина аргументов для нового процесса». www.in-ulm.de.
- ^ Различия между xargs и GNU Parallel. GNU.org. По состоянию на февраль 2012 г.
- ^ Единая спецификация UNIX, Выпуск 7 из Открытая группа - Справочник по командам и утилитам,
- ^ Cosmin Stejerean. "То, что вы (вероятно) не знали о xargs". Получено 7 декабря, 2015.
внешняя ссылка
Викибук Руководство по Unix есть страница по теме: Команды |
- Единая спецификация UNIX, Выпуск 7 из Открытая группа : создать списки аргументов и вызвать утилиту - Справочник по командам и утилитам,
- Руководство по Linux Xargs Command с примерами
Страницы руководства
- GNU Findutils ссылка –
- FreeBSD Общие команды Руководство : создать список аргументов и выполнить утилиту -
- NetBSD Общие команды Руководство : создать список аргументов и выполнить утилиту -
- OpenBSD Общие команды Руководство : создать список аргументов и выполнить утилиту -
- Solaris 10 Справочник по командам пользователя Руководство : создать списки аргументов и вызвать утилиту -