Quiero encontrar todos los directorios con una cadena específica para poder hacer otra búsqueda en los archivos que contiene.
Así que no quiero perder el tiempo en ./my-search-term/dir/my-search-term
etc.
¿Cómo puedo dejar de recurrir cuando encuentro el primer directorio my-search-term?
Respuestas:
La
-prune
acción hace quefind
no se repita en el directorio. Puede combinarlo con otra acción como-exec
(el orden de-prune
y-exec
no importa, siempre que-prune
se ejecute de cualquier manera).Tenga en cuenta que anidar
find
dentro de afind -exec
puede ser un poco problemático: no se puede usar-exec
en el interiorfind
, porque el terminador sería visto como un terminador por el exteriorfind
. Puede evitar eso invocando un shell, pero tenga cuidado con las citas.fuente
-prune
devuelve verdadero y se puede poner antes de-exec
.-o
allí, supongo. Y supongo que poner-prune
antes-exec
es más legible.-prune
opción antes.mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
da el error:find: ./x1: No such file or directory
. La solución es agregar-prune
al final delfind
comando.find
expandir{}
incluso cuando aparece como una subcadena de un argumento para-exec
. Tal versión defind
se ahogará en su segundo comando, porque el comando{}
internofind
(en el comando de shell) será reemplazado por el nombre del directorio que se encuentra en el externofind
. Puede arreglar eso diciendofind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
, es decir, usando"{"}
, en lo que se convertirá el shell{}
. ... (Continúa)- soluciones desnudas -
Si desea
find
omitir los contenidos del directorio encontrado, pero continúa buscando en otros directorios, use-prune
como sugirió @laebshade. El comando completo debería verse asíPor otro lado, si desea dejar de buscar
find
por completo y después de encontrar el primer directorio coincidente, entonces lo que está buscando es (disponible desde la versión de ). Este es un poco más complicado de usar, ya que hace que la salida sea inmediata, por lo que debe colocarse al final del comando:-quit
4.2.3
GNU find
find
-quit
Para que esto funcione como se esperaba, uno tiene que asegurarse de que los
-exec
retornos sean verdaderos (en otras palabras, un estado cero ). Si desea-exec
que se ignore el estado de salida de , para que eso-quit
siempre funcione, necesita un pequeño truco:o
o
- alguna explicación -
Lo más importante acerca de cómo
find
funciona es que todas las acciones ("pruebas") se tratan como predicados lógicos interpretados de izquierda a derecha. Por lo tanto, la última acción (por ejemplo-quit
) solo se realizará si toda la parte anterior no devolvió falso . Por defecto, todas las pruebas se unen con "AND" lógico, la-o
opción cambia la unión a "OR".Un elemento complicado
-o
es quefind
puede "optimizar" su comando y no ejecutar la-exec
parte si escribe soloPara hacer frente a eso, puede forzar
find
a evaluar todos los predicados con "O", encerrándolos entre paréntesis.fuente