¿Por qué hay una diferencia en la producción entre usar
find . -exec ls '{}' \+
y
find . -exec ls '{}' \;
Tengo:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
asociado con-exec
siempre se escapa, pero+
asociado con-mtime
no. ¿Sabes la razón? Supongo que es un hábito de escapar;
asociado con-exec
.;
. No puedo imaginar que alguna vez sea necesario escapar+
Todas las respuestas hasta ahora son correctas. Ofrezco esto como una demostración más clara (para mí) del comportamiento que se describe utilizando en
echo
lugar dels
:Con un punto y coma, el comando
echo
se llama una vez por archivo (u otro objeto del sistema de archivos) encontrado:Con un plus, el comando
echo
se llama una sola vez. Cada archivo encontrado se pasa como argumento.Si
find
aparece un gran número de resultados, puede encontrar que el comando que se llama chokes en el número de argumentos.fuente
xargs
hacer ... en principio nunca se ahoga por demasiados argumentos.find
(yxargs
) en Solaris emitir más argumentos de los que podrían consumirse. Losxargs
(yfind
) en findutils de GNU parecen comportarse de manera más sensata, pero no todos usan GNU.find
intentarían evitar alcanzar el límite en la cantidad de argumentos. Y eso incluye Solaris '(al menos 10). Donde puede fallar es si haces algo comofind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
ofind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, perofind
realmente no se puede culpar por eso. Tenga en cuenta que GNUfind
fue una de las últimasfind
implementaciones de soporte+
(solía ser una molestia para portar script a sistemas GNU).De
man find
:-exec comando;
-exec comando {} +
Entonces, según tengo entendido,
\;
ejecuta un comando separado para cada archivo encontrado porfind
, mientras que\+
agrega los archivos y ejecuta un solo comando en todos ellos. El\
es un personaje de escape, entonces es:vs
Hacer lo anterior en mi shell reflejó el resultado en su pregunta.
ejemplo de cuándo querrías usar
\+
Supongamos dos archivos
1.tmp
y2.tmp
:1.tmp:
2.tmp:
Con
\;
:Mientras que si usa
\+
(para concatenar los resultados defind
):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\+
conrm
es uno de esos casos, donde si está eliminando una gran cantidad de archivos, el rendimiento (velocidad) será superior a\;
.fuente
find
tiene sintaxis especial Usas los{}
tal como están porque tienen significado para buscar como el nombre de ruta del archivo encontrado y (la mayoría) los shells no los interpretan de otra manera. Necesita la barra diagonal inversa\;
porque el punto y coma tiene significado para el shell, que lo consume antes defind
poder obtenerlo. Entonces, lo quefind
quiere ver DESPUÉS de que se haga el shell, en la lista de argumentos pasada al programa C, espero necesita
\;
en la línea de comando para obtener un punto y coma a través de la shell a los argumentos.Puede salirse con la suya
\{\}
porque la interpretación citada de shell\{\}
es justa{}
. Del mismo modo, puede usar '{}'.Lo que no puedes hacer es usar
porque el intérprete interpreta eso como un argumento,
y
rm {} ;
no es el nombre de un comando. (Al menos a menos que alguien esté realmente jodiendo).Actualizar
la diferencia es entre
y
El
+
está cateando los nombres en una línea de comando.fuente
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:
El uso
+
ejecutará los comandos menos posibles (ya que los argumentos se combinan juntos). Es muy similar a cómoxargs
funciona 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:
Ver también:
man find
fuente
Estábamos tratando de encontrar el archivo para la limpieza.
encontrar . -exec echo {} \; El comando se ejecutó durante la noche al final sin resultado.
encontrar . -exec echo {} \ + tiene resultados y solo tomó unas pocas horas.
Espero que esto ayude.
fuente