Quiero saber el significado de {} +
en el exec
comando 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 {} \;
Comentarios
Responder
El uso de ;
(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 a find «s -exec
/ -execdir
parámetro. Por ejemplo:
-
al usar
;
se ejecutarán varios 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 para
find
se toman como argumentos para el comando.La cadena
{}
se reemplaza por el nombre de archivo actual Se está procesando. -
usando
+
ejecutará la menor cantidad posible de comandos (ya que los argumentos se combinan). Es muy similar a cómo funciona el comandoxargs
, 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 comandos se crea agregando cada nombre de archivo seleccionado al final.
Solo se permite una instancia de
{}
dentro del comando.
Consulte también:
-
man find
- Uso de punto y coma (;) frente a más (+) con exec en buscar en SO
- Comando simple de Unix, ¿cuál es el {} y \; para en SO
Comentarios
- Hay una diferencia y una importante. Consulte la user1116056 ' s respuesta
Responder
Dado que el el comando find aparece debajo de tres archivos:
fileA fileB fileC
Si usa -exec
con un signo más (+
) signo,
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 xargs
construye sus líneas de comando. El número total de invocaciones del comando (chmod
, en este caso) será mucho menor que el número de archivos coincidentes.
Si usa -exec
con un punto y coma (;
),
find . -type f -exec chmod 775 {} \;
será:
chmod 775 fileA chmod 775 fileB chmod 775 fileC
Respuesta
Según man find
:
-exec command {} + Este La variante de la acción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se construye 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 está construida 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.
man find(1)
con mucho detalle, fácilmente para que cualquiera pueda encontrarlo. No ' sea holgazán.man exec
!{} +
. Normalmente uso xargs para eso (y a menudofind ... -print0 | xargs -0 ...
)