De man find
:
-exec comando;
Ejecutar comando; verdadero si se devuelve el estado 0. Todos los siguientes argumentos para encontrar se consideran argumentos del comando hasta que un argumento que consista en '; se encuentra La cadena '{}' se reemplaza por el nombre del archivo actual que se procesa en todas partes donde aparece en los argumentos del comando, no solo en los argumentos donde está solo, como en algunas versiones de find. Es posible que sea necesario escapar de estas dos construcciones (con un '\') o citarlas para protegerlas de la expansión del shell. Consulte la sección de EJEMPLOS sec para ver ejemplos del uso de la opción '-exec'. El comando especificado se ejecuta una vez para cada archivo coincidente.
El comando se ejecuta en el directorio de inicio. Hay problemas de seguridad inevitables en torno al uso de la opción -exec;
-exec comando {} +
Esta variante de la opció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.
Entonces, según tengo entendido, \;
ejecuta un comando separado para cada archivo encontrado por find
, mientras que \+
agrega los archivos y ejecuta un solo comando en todos ellos. El \
es un personaje de escape, entonces es:
ls testdir1; ls testdir2
vs
ls testdir1 testdir2
Hacer lo anterior en mi shell reflejó el resultado en su pregunta.
ejemplo de cuándo querrías usar \+
Supongamos dos archivos 1.tmp
y 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
Con \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Mientras que si usa \+
(para concatenar los resultados de find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
Entonces, en este caso, es la diferencia entre diff 1.tmp; diff 2.tmp
ydiff 1.tmp 2.tmp
Hay casos donde \;
es apropiado y \+
será necesario. El uso \+
con rm
es uno de esos casos, donde si está eliminando una gran cantidad de archivos, el rendimiento (velocidad) será superior a \;
.