Pendahuluan: Saya mengerti perbedaan antara -exec {} \;
& -exec {} +
. Saya juga tidak punya masalah seperti itu , saya hanya ingin tahu tentang semantik find
.
Saat mengakhiri -exec
argumen dengan +
alih - alih ;
, kita perlu mengakhiri ini dengan {} +
, misalnya:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
Menggunakan ;
dalam contoh-contoh ini bukannya +
berfungsi dengan baik (tapi jelas melakukan sesuatu yang lain).
Dari POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Hanya <plus-sign> yang segera mengikuti argumen yang hanya berisi dua karakter "
{}
" yang akan menandai akhir dari ekspresi utama. Penggunaan lain dari <plus-sign> tidak akan diperlakukan sebagai khusus.
Dengan kata lain, saat menggunakan +
, perintah harus diakhiri dengan {} +
.
Kenapa ini? Dan mengapa hanya dengan +
dan bukan ;
? Pada awalnya saya pikir mungkin untuk menghindari konflik dengan nama file yang mengandung +
, tetapi nama file dengan ;
tampaknya berfungsi dengan baik? Saya merasa sulit untuk percaya batasan ini sewenang-wenang ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
dan dalam dokumen itu Anda akan menemukan rincian lebih lanjut, misalnya: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".