Более глупые вопросы от Linux n00b.=D
Мне любопытно на предмет разветвлений производительности использования xargs по сравнению с обратными галочками.
Например, что является различным между:
find ./ -name foo* | xargs rm
и
rm `find ./ -name foo*`
Мне кажется, что это была бы лучшая практика, чтобы передать по каналу и использовать xargs, поскольку материал мог быть обработан в последовательном порядке.
Ваши мысли?
- M
Вред обратных галочек при контакте с более сложными сценариями; необходимо тщательно выйти из содержания обратных галочек. Из-за этого я часто изменяю их в $(...)
.
xargs
мог бы звонить rm
многократно в Вашем примере, если существует много файлов - системы POSIX могут иметь верхний предел длины параметров команды.
xargs
имеет другие функции, которые не делают обратные галочки: f.e. xargs
может взять параметры, разделенные \0
байт для контакта с именами файлов с пробелами.
Если Вы имеете дело только с несколькими путями, которые не содержат пробел, то они эквивалентны.
В некоторых системах ограничена максимальная длина единственной командной строки (на самом деле, среда плюс аргументы, отправленные должностному лицу (2) - вызов семейства) (см. kern.argmax). В ограниченной системе, если find
производит слишком много вывода, оболочка не смогла бы вместить все это в окружающую командную строку. Зафиксировать это, xargs
берет вывод find
и комбинирует 'слова' (да, слова, не строки, видят ниже) в группы, которые вписываются в единственную командную строку.
Во-вторых, оба xargs
и оболочка (через обратные галочки) распадется find
вывод в аргументы в пользу rm
путем маркирования вывода при каждом выполнении любой комбинации пространства, вкладки или символов новой строки (это - упрощение, так как у них обоих есть свои собственные правила заключения в кавычки, которые близки, но не идентичны). Если find
-print
s путь “.//нечто/панель quux”, rm
будет в конечном счете видеть два аргумента (“.//нечто/панель” и “quux”). Если файл называют quux
существовавший в cwd, с которого Вы запустили, это закончится, когда это было на всем протяжении (и “.//нечто/панель quux” все еще было бы там!).
Таким образом, самый устойчивый метод должен использовать find
-print0
и xargs
-0
Расширение POSIX. Сотрудничество, они могут использоваться для устойчивого переноса любого легального пути от вывода find
к командной строке любой другой команды в любой системе, которая поддерживает эти два расширения.
find . -name foo\* | xargs -0 rm
Устойчивость прибывает из того, что байт NUL, что оба использования расширений для завершения путей является единственным запрещенным байтом в примерно всем (oid Unix) Ose.
Если программа поддерживает несколько аргументов в том порядке, обратные галочки должны работать тождественно. С тех пор не все программы поддерживают несколько аргументов как этот, проблема возникает, когда команда в обратных галочках выполняется и возвращает несколько результатов. Если Вы знаете, что последняя команда будет работать, использовать его. Если Вы не уверены, придерживаетесь использования xargs
быть безопасным. find
также имеет полезное -exec
переключатель, который может использоваться как так:
find / -type f -exec grep -i word {} +
откуда фигурные скобки заменяются текущим соответствием файла find
.