Широкая поддержка поиска с "-exec … +"?

Широкая поддержка поиска с "-exec … +"?

Судя пожурнал изменений GNU findutilsон должен был находиться в базе GNU по крайней мере десять лет (и даже дольше, чем был частью POSIX), так что можно ли с уверенностью предположить, что теперь он поддерживается везде?

Кроме того, есть ли веские причины рекомендовать использовать его xargsв тех случаях, когда его -exec … +можно использовать? (Очевидно, что вы бы использовали его, xargsесли бы вам понадобились некоторые из этих специальных параметров, например, для управления максимальным числом аргументов, параллелизмом и т. д.)

Интересная цитата изчасть документации GNU findutil:

[найти с -exec … +]может быть менее эффективным, чем некоторые применения xargs; например, xargsпозволяет создавать новые командные строки, пока предыдущая команда все еще выполняется, и позволяет вам указать несколько команд для параллельного выполнения. Однако конструкция find ... -exec ... +имеет преимущество широкой переносимости. GNU findutils не поддерживал ' -exec ... +' до версии 4.2.12[Январь 2005]; одной из причин этого является то, что -print0в любом случае уже имело место действие ' '.

решение1

Вариант +был -execпредставлен в POSIX послеИнтерпретация PASC 1003.2 #210в 2001 году и объединен со стандартом POSIX в выпуске 6 (как задокументировано в текущем стандартеfind(1)документация). Согласно интерпретации, все производные System V Release 4 поддерживают его, как и HP-UX (в 2001 году — я знаю, что HP-UX 10 его не поддерживал); очевидно, любые системы, совместимые с POSIX Issue 6 или 7, также поддерживают его.

GNU-изм на самом деле — это find -print0 | xargs -0набор команд. Если -exec ... +есть, а -0поддержка в xargs— нет, вам определенно лучше использовать первый вариант; даже несмотря на то, -0что нет причин не использовать его, -exec ... +если он поддерживает то, что вам нужно.

решение2

Можно ли с уверенностью предположить, что [ -exec ...] теперь поддерживается везде?

Ожидается, что вариант -exec ... '{}' ';', который обеспечивает ровно одно совпадение на каждую выполненную команду, теперь будет поддерживаться везде, даже в не-POSIX-системах Unix.

Вариант -exec ... '{}' +, я не уверен. Правда, он определен вPOSIX-1, поэтому он определенно поддерживается во всех текущих системах POSIXy. Однако я не уверен, поддерживают ли его все старые системы Unix (которые все еще используются).

Есть ли веские причины рекомендовать использовать xargs вместо [ ] в случаях, когда -exec ... '{}' +можно использовать [ ]?

Нет, не совсем. Зачем использовать две команды, когда достаточно одной?

Проблема в том, что если единственный известный вам инструмент — молоток, все проблемы кажутся гвоздями. Сила xargsзаключается в том, что вы можете манипулировать списком совпадений, используя bash, sed, awk, и так далее, прежде чем выполнять команду(ы), действующие на список.

(На практике это требует, чтобы имена файлов и каталогов не содержали встроенных символов новой строки. Bash и GNU find, sed, awk и xargs поддерживают символ NUL \0в качестве разделителя, поэтому они могут без проблем манипулировать всеми возможными именами файлов.)

Связанный контент