Find

為什麼’find -exec cmd {} +‘需要以’{} +‘結尾?

  • January 16, 2015

-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> 才能標出主要表達式的結尾。<加號> 的其他用途不應被視為特殊。

換句話說,當使用 時+,命令需要以 結尾{} +

為什麼是這樣?為什麼只有 the+而不是 the ;?起初我想可能是為了避免與包含 a 的文件名發生衝突+,但是帶有 a 的文件名;似乎可以正常工作?我很難相信這個限制是任意的……

POSIX 規範中給出的基本原理是:

採用的"-exec ... {} +"語法是 IEEE PASC 解釋 1003.2 #210 的結果。應該注意的是,這是對 ISO/IEC 9899:1999 標準的不兼容更改。例如,'-'如果是正常文件,則以下命令列印名稱後帶有 a 的所有文件,'+'否則列印 a:

find / -type f -exec echo {} - ';' -o -exec echo {} + ';'

更改使這樣的用法無效。儘管以前的標準聲明這種用法會起作用,但實際上許多人並不支持它,標准開發人員認為現在聲明這是不允許的更好。

PASC 解釋 1003.2 #210更詳細地介紹了-exec … {} +. 在被 POSIX 採用之前,它存在於幾個 Unix 系統上;缺陷報告將其追溯到SVR4(它在很大程度上沒有記錄在案)。缺陷報告證明不兼容的更改在實踐中幾乎沒有影響:

請注意,只有緊跟在“{}”之後的“+”才被視為特殊符號。這最大限度地減少了現有使用“+”作為“-exec”的參數引起問題的可能性。

儘管添加對 的支持-exec … {} +會破壞一些符合標準的應用程序,例如上面的範例,但這些應用程序的數量比-exec … {} … +允許的要少。

也許,限制{}為最後一個論點的另一個原因是易於實施。如果{}允許在參數列表中的任何位置到-exec,則find程序必須通過複製靜態參數,然後是變數部分,然後是另一個靜態部分來建構命令行。這將使構造參數列表和考慮大小限制變得更加困難。難度很小,但實施者喜歡偷工減料。支持多個可替代的實例{}(如果-exec {} foo +要工作,從邏輯上也可以預期-exec {} foo {} +)將變得更加困難。

引用自:https://unix.stackexchange.com/questions/179346