¿Qué significa {} + en el comando find's -exec?

23

Quiero saber el significado de {} +en el execcomando y cuál es la diferencia entre {} +y {} \;. Para ser exactos, ¿cuál es la diferencia entre estos dos:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Mohsen
fuente
55
Se describe con man find(1)mucho detalle, fácil de encontrar por cualquier persona. No seas perezoso
Miroslav Koškár
Gracias querido Miroslav, busqué en man exec!
Ah, nunca me había encontrado con el {} +uso antes. Normalmente uso xargs para eso (y a menudo find ... -print0 | xargs -0 ...)

Respuestas:

27

Usar ;(punto y coma) o +(signo más) es obligatorio para terminar los comandos de shell invocados por -exec/ execdir.

La diferencia entre ;(punto y coma) o +(signo más) es cómo se pasan los argumentos al parámetro -exec/ encontrar -execdir. Por ejemplo:

  • utilizando ;ejecutará múltiples comandos (por separado para cada argumento),

    Ejemplo:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    Todos los siguientes argumentos findse consideran argumentos del comando.

    La cadena {}se reemplaza por el nombre del archivo actual que se está procesando.

  • El uso +ejecutará los comandos menos posibles (ya que los argumentos se combinan juntos). Es muy similar a cómo xargsfunciona el comando, por lo que utilizará tantos argumentos por comando como sea posible para evitar exceder el límite máximo de argumentos por línea.

    Ejemplo:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    La línea de comando se construye agregando cada nombre de archivo seleccionado al final.

    Solo {}se permite una instancia de dentro del comando.

Ver también:

kenorb
fuente
No es una diferencia y una de las principales. Ver la respuesta del
usuario1116056
24

Dado que el comando find se encuentra debajo de tres archivos:

fileA
fileB
fileC

Si lo usa -execcon un +signo más ( ),

find . -type f -exec chmod 775 {} +  

será:

chmod 775 fileA fileB fileC

La línea de comando se construye agregando cada nombre de archivo coincidente al final, que es de la misma manera que xargsconstruye sus líneas de comando. El número total de invocaciones del comando ( chmoden este caso) será mucho menor que el número de archivos coincidentes.

Si usa -execcon un punto y coma ( ;),

find . -type f -exec chmod 775 {} \;

será:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
usuario1116056
fuente
5

Según man find:

-exec command {} + Esta variante de la acción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se crea agregando cada nombre de archivo seleccionado al final; El número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando se construye de la misma manera que xargs construye sus líneas de comando. Solo se permite una instancia de '{}' dentro del comando. El comando se ejecuta en el directorio de inicio.

BE77Y
fuente