Вопрос состоит из двух частей:
- как же
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может обрабатывать странные имена файлов самостоятельно ..