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