1

Более глупые вопросы от Linux n00b. = D

Мне любопытно о последствиях производительности использования xargs против backticks.

Например, в чем разница между:

find ./ -name foo* | xargs rm

а также

rm `find ./ -name foo*`

Мне кажется, что было бы лучше использовать конвейер и использовать xargs, так как материал можно обрабатывать в последовательном порядке.

Твои мысли?

3 ответа3

2

Обратные палочки болят при работе с более сложными сценариями; Вы должны тщательно избегать содержимого обратных кавычек. Из-за этого я часто меняю их на $(...) .

xargs может вызывать rm несколько раз в вашем примере, если файлов много - системы POSIX могут иметь верхний предел длины параметров команды.

xargs есть и другие функции, которых нет у обратных галочек : fe xargs может принимать параметры, разделенные байтом \0 для работы с именами файлов с пробелами.

2

Если вы имеете дело только с несколькими путями, которые не содержат пробелов, то они эквивалентны.

В некоторых системах максимальная длина одной командной строки (фактически, среда плюс аргументы, отправляемые на вызов семейства exec (2)) ограничена (см. Kern.argmax). В ограниченной системе, если find производит слишком много выходных данных, оболочка не сможет вписать все это в окружающую командную строку. Чтобы исправить это, xargs берет вывод команды find и объединяет слова (да, слова, а не строки, см. Ниже) в группы, которые помещаются в единую командную строку.

Во-вторых, и xargs и оболочка (с помощью обратных галочек) будут разбивать выходные данные find на аргументы для rm путем токенизации выходных данных при каждом запуске любой комбинации символов пробела, табуляции или новой строки (это упрощение, поскольку у них обоих есть свои собственные правила цитирования, которые близки, но не идентичны). Если find -print s путь к «.//foo/bar quux», rm конечном итоге увидит два аргумента («.//foo/bar» и «quux»). Если бы файл с именем quux существовал в cwd, с которого вы начали, он исчез бы, когда все было кончено (а «.//foo/bar quux» все равно был бы там!).

Таким образом, наиболее надежный метод заключается в использовании find -print0 s и xargs POSIX-расширение ы -0 Работая вместе, они могут использоваться для надежной передачи любого допустимого пути из вывода find в командную строку любой другой команды в любой системе, которая поддерживает два расширения.

find . -name foo\* | xargs -0 rm

Надежность происходит из-за того, что байт NUL, который оба расширения используют для завершения имен путей, является единственным запрещенным байтом практически во всех (Unix-oid) ОС.

1

Если программа поддерживает несколько аргументов в указанном порядке, обратные пометки должны выполняться одинаково. Поскольку не все программы поддерживают несколько таких аргументов, проблема возникает, когда команда в обратных галочках выполняется и возвращает несколько результатов. Если вы знаете, что последняя команда будет работать, используйте ее. Если вы не уверены, используйте xargs для безопасности. find также имеет полезный ключ -exec который можно использовать так:

find / -type f -exec grep -i word {} +

где фигурные скобки заменены текущим совпадением файла от find .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .