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-termetc.
¿Cómo puedo dejar de recurrir cuando encuentro el primer directorio my-search-term?

Respuestas:
La
-pruneacción hace quefindno se repita en el directorio. Puede combinarlo con otra acción como-exec(el orden de-pruney-execno importa, siempre que-prunese ejecute de cualquier manera).Tenga en cuenta que anidar
finddentro de afind -execpuede ser un poco problemático: no se puede usar-execen 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
-prunedevuelve verdadero y se puede poner antes de-exec.-oallí, supongo. Y supongo que poner-pruneantes-execes más legible.-pruneopció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-pruneal final delfindcomando.findexpandir{}incluso cuando aparece como una subcadena de un argumento para-exec. Tal versión defindse 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
findomitir los contenidos del directorio encontrado, pero continúa buscando en otros directorios, use-prunecomo sugirió @laebshade. El comando completo debería verse asíPor otro lado, si desea dejar de buscar
findpor 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:-quit4.2.3GNU findfind-quitPara que esto funcione como se esperaba, uno tiene que asegurarse de que los
-execretornos sean verdaderos (en otras palabras, un estado cero ). Si desea-execque se ignore el estado de salida de , para que eso-quitsiempre funcione, necesita un pequeño truco:o
o
- alguna explicación -
Lo más importante acerca de cómo
findfunciona 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-oopción cambia la unión a "OR".Un elemento complicado
-oes quefindpuede "optimizar" su comando y no ejecutar la-execparte si escribe soloPara hacer frente a eso, puede forzar
finda evaluar todos los predicados con "O", encerrándolos entre paréntesis.fuente