Передмова: Я розумію різницю між -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 ...] {} +
... Тільки <plus-sign>, який негайно слідує за аргументом, що містить лише два символи, "
{}
" пунктуаціює кінець основного виразу. Інші способи використання <plus-sign> не розглядаються як особливі.
Іншими словами, при використанні +
команди команда повинна закінчуватися {} +
.
Чому це? І чому тільки з тим, +
а не тим ;
? Спочатку я думав, можливо, щоб уникнути конфліктів із іменами файлів, які містять +
, але назви файлів, ;
схоже, спрацюють нормально? Мені важко повірити, що це обмеження є довільним ...
The "-exec ... {} +" syntax adopted was a result of
IEEE 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".