Вопрос состоит из двух частей:
- как же
find
управлять с программами обработки вызовов с использованием -exec
не сталкиваясь с проблемами пространств , вложенных в именах файлов, и
- чем хорош
-print0
вариант?
Во-первых, find
это системный вызов, фактически один из группы связанных вызовов, называемых «exec» . Он передает имя файла в качестве аргумента непосредственно этому вызову, который затем передается напрямую (после создания нового процесса) без потери информации о имени файла.
POSIX find
особенность +
объясняется следующим образом , в обосновании :
Особенностью find
утилиты SVR4 был -exec
первичный + терминатор. Это позволило группировать имена файлов, содержащие специальные символы (особенно символы новой строки ), без проблем, возникающих, если такие имена файлов передаются по конвейеру xargs
. Другие реализации добавили другие способы обойти эту проблему, в частности -print0
основной, который написал имена файлов с нулевым байтовым терминатором. Это было рассмотрено здесь, но не принято. Использование нулевого терминатора означало, что любая утилита, которая собиралась обрабатывать -print0
вывод find,
должна была добавить новую опцию для анализа нулевых терминаторов, которые она теперь будет читать.
Это « в частности-print0
, первичный» относится к GNU find
и xargs
которые решают эту проблему по-другому. Это также поддерживается FreeBSD find
и xargs
. Если вы добавили -0
опцию (см. Страницу руководства ) к xargs
вызову, то эта программа принимает строки, оканчивающиеся символами «нулевой байт». В свою очередь xargs
вызывает exec -functions для выполнения своей работы. Основное различие между -print0
и -0
особенности по сравнению с +
особенностью является то , что бывший передает имена файлов через трубу, а второй нет. Разработчики находят применение практически для любой функции; трубы не являются исключением.
Вернемся к примеру OP, в котором используется -t
опция cp
: которая не найдена в POSIX cp . Скорее, это расширение (также называемое «нестандартной функцией»), предоставляемое GNU cp . -0
Расширение xargs
не улучшит этот пример, но есть и другие случаи , когда могут быть эффективно использованы по поддержанию в виду , что есть портативная альтернатива +
, которая GNU find
принимает.
find..exec
может обрабатывать странные имена файлов самостоятельно ..