xargs по сравнению с обратной галочкой

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

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

Например, что является различным между:

find ./ -name foo* | xargs rm

и

rm `find ./ -name foo*`

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

Ваши мысли?

- M

1
задан 03.11.2009, 05:38

3 ответа

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

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

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

2
ответ дан 12.12.2019, 08:41

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

В некоторых системах ограничена максимальная длина единственной командной строки (на самом деле, среда плюс аргументы, отправленные должностному лицу (2) - вызов семейства) (см. kern.argmax). В ограниченной системе, если find производит слишком много вывода, оболочка не смогла бы вместить все это в окружающую командную строку. Зафиксировать это, xargs берет вывод find и комбинирует 'слова' (да, слова, не строки, видят ниже) в группы, которые вписываются в единственную командную строку.

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

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

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

Устойчивость прибывает из того, что байт NUL, что оба использования расширений для завершения путей является единственным запрещенным байтом в примерно всем (oid Unix) Ose.

2
ответ дан 12.12.2019, 08:41

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

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

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

1
ответ дан 12.12.2019, 08:41

Теги

Похожие вопросы