Perché 'find -exec cmd {} +' deve finire con '{} +'?


11

Prefazione: capisco la differenza tra -exec {} \;& -exec {} +. Inoltre non ho un problema in quanto tale , sono solo curioso della semantica di find.


Quando si termina l' -execargomento con +anziché anziché ;, è necessario terminarlo con {} +, ad esempio:

# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"

# GNU find is even more cryptic:
$ find: missing argument to `-exec'

L'uso ;in questi esempi invece di +funziona benissimo (ma ovviamente fa qualcos'altro).

Da POSIX :

-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +

... Solo un <plus-sign> che segue immediatamente un argomento contenente solo i due caratteri " {}" deve punteggiare la fine dell'espressione primaria. Gli altri usi di <plus-sign> non devono essere considerati speciali.

In altre parole, quando si utilizza il +, il comando deve terminare con {} +.

Perchè è questo? E perché solo con il +e non il ;? All'inizio ho pensato forse di evitare conflitti con i nomi di file che contengono un +, ma i nomi di file con un ;sembrano funzionare bene? Trovo difficile credere che questa limitazione sia arbitraria ...


3
FWIW, la pagina POSIX dice anche che The "-exec ... {} +" syntax adopted was a result of IEEE PASC Interpretation 1003.2 #210e in quel documento troverai maggiori dettagli, ad esempio: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".
don_crissti

Risposte:


5

La logica fornita nella specifica POSIX è:

La "-exec ... {} +"sintassi adottata era il risultato di IEEE PASC Interpretation 1003.2 # 210. Va notato che si tratta di una modifica incompatibile con lo standard ISO / IEC 9899: 1999. Ad esempio, il comando seguente stampa tutti i file con un '-'nome dopo se sono file normali e un '+'altro:

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

La modifica invalida l'utilizzo in questo modo. Anche se lo standard precedente affermava che questo utilizzo avrebbe funzionato, in pratica molti non lo supportavano e gli sviluppatori di standard sentivano meglio affermare ora che ciò non era consentito.

PASC Interpretation 1003.2 # 210 approfondisce la storia di -exec … {} +. Esisteva su diversi sistemi Unix prima di essere adottato da POSIX; il rapporto sui difetti lo fa risalire a SVR4 (dove era ampiamente privo di documenti). Il rapporto sui difetti giustifica la modifica incompatibile che ha scarso impatto nella pratica:

Si noti che "+" viene considerato speciale solo se segue immediatamente "{}". Ciò riduce al minimo le possibilità di causare problemi con gli usi esistenti di "+" come argomento con "-exec".

Sebbene l'aggiunta del supporto per -exec … {} +interromperà alcune applicazioni conformi come nell'esempio sopra, ce ne sono meno di quelle -exec … {} … +consentite.

Un altro motivo, forse, per limitare {}ad essere l'ultimo argomento è la facilità di implementazione. Se {}fosse consentito in qualsiasi punto dell'elenco degli argomenti -exec, il findprogramma dovrebbe creare la riga di comando copiando gli argomenti statici, quindi la parte variabile, quindi un'altra parte statica. Ciò renderebbe più difficile costruire l'elenco degli argomenti e tenere conto del limite di dimensioni. La difficoltà è minima, ma agli implementatori piace tagliare gli angoli. Supportare più istanze sostituibili di {}(se -exec {} foo +funziona, ci si può aspettare logicamente che -exec {} foo {} +lo sia) sarebbe significativamente più difficile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.