Если вы имеете дело только с несколькими путями, которые не содержат пробелов, то они эквивалентны.
В некоторых системах максимальная длина одной командной строки (фактически, среда плюс аргументы, отправляемые на вызов семейства 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) ОС.