Lời nói đầu: Tôi hiểu sự khác biệt giữa -exec {} \;
& -exec {} +
. Tôi cũng không có vấn đề như vậy , tôi chỉ tò mò về ngữ nghĩa của find
.
Khi kết thúc -exec
đối số bằng +
thay vì ;
, chúng ta cần kết thúc điều này bằng {} +
, ví dụ:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
Sử dụng ;
trong các ví dụ này thay vì +
hoạt động tốt (nhưng rõ ràng làm một cái gì đó khác).
Từ POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Chỉ một <dấu cộng> ngay sau một đối số chỉ chứa hai ký tự "
{}
" sẽ chấm dứt phần cuối của biểu thức chính. Việc sử dụng <dấu cộng> khác sẽ không được coi là đặc biệt.
Nói cách khác, khi sử dụng +
, lệnh cần kết thúc bằng {} +
.
Tại sao lại thế này? Và tại sao chỉ với +
và không ;
? Lúc đầu tôi nghĩ có lẽ để tránh xung đột với tên tập tin có chứa a +
, nhưng tên tập tin có ;
vẻ hoạt động tốt? Tôi thấy khó tin rằng giới hạn này là tùy tiện ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
và trong tài liệu đó, bạn sẽ tìm thấy nhiều chi tiết hơn, ví dụ: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".