Qual è la differenza tra l'utilizzo di '+' (più) e ';' (punto e virgola) nel comando -exec?


28

Mi chiedo di sapere che differenza c'è tra l'utilizzo +e ;alla fine del -execcomando quando uso nel findcomando?

find .... -exec ... \; 

VS

find .... -exec ... + 

Risposte:


36

-exec ... \;eseguirà un elemento dopo l'altro. Quindi, se hai tre file, la riga exec verrà eseguita tre volte.

-exec ... {} +è per i comandi che possono prendere più di un file alla volta (per esempio cat, stat, ls). I file trovati da findsono concatenati insieme come un xargscomando. Ciò significa meno forking out e per piccole operazioni, può significare un notevole aumento di velocità.

Ecco una demo delle prestazioni che cattura 10.000 file vuoti.

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

Ancora una volta questo funziona solo su comandi che possono assumere più nomi di file. Puoi capire se il tuo comando è così guardando la sua manpage. Ecco la sinossi di man cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

I puntini di sospensione [FILE]...indicano che può richiedere più di un file.

+può essere utilizzato solo su singoli comandi e devi averne esattamente uno {}nella riga. \;può operare con più gruppi da zero a molti.


4
Esempio: con \;, il comando eseguito sarebbe cat 1; cat 2; cat 3. Con +, il comando eseguito sarebbe cat 1 2 3.
Alaa Ali,

AFAIK, +non è POSIX, quindi potrebbe non essere disponibile su sistemi non Linux. Non è un problema se non si abbandona mai la piattaforma, ma è bene sapere se è necessario utilizzare Solaris. :)
Simon Richter,

Oh bello, grazie per le informazioni. In genere -exec <command> {} ';'perché è più semplice scrivere (posso toccare il tipo ma non ho esattamente la tecnica migliore).
hanetzer,

2
@SimonRichter: No, -exec ... {} +è POSIX. Vedi: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm

@SimonRichter L' -exec ... {} +estensione è stata suggerita per l'inclusione nelle specifiche POSIX nel 2001 ed è stata ratificata nel numero 6 di POSIX nel 2004. È possibile che la versione di Solaris a cui sei abituato sia più vecchia di quella standard POSIX (o abbia come target una versione precedente).
Oli
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.