Предисловие: я понимаю разницу между -exec {} \;& -exec {} +. У меня также нет проблемы как таковой , мне просто интересно узнать о семантике find.
Когда заканчивается -execаргумент +вместо ;, нам нужно завершить это {} +, например:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
Использование ;в этих примерах вместо +прекрасно работает (но, очевидно, делает что-то еще).
Из POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +... Только знак «плюс», который следует сразу за аргументом, содержащим только два символа «
{}», должен быть акцентирован на конце основного выражения. Другие варианты использования знака «плюс» не должны рассматриваться как особые.
Другими словами, при использовании +, команда должна заканчиваться на {} +.
Почему это? А почему только с то +а не то ;? Сначала я подумал, может быть, чтобы избежать конфликтов с именами файлов, которые содержат +, но имена с надписью ;вроде бы работают нормально? Мне трудно поверить, что это ограничение является произвольным ...
The "-exec ... {} +" syntax adopted was a result ofIEEE PASC Interpretation 1003.2 #210и в этом документе вы найдете больше деталей, например:Note that the "+" is only treated as special if it immediately follows "{}". This minimises the chances of causing problems with existing uses of "+" as an argument with "-exec".