Tal vez sea un poco extraño – y tal vez haya otras herramientas para hacer esto pero, bueno ..

Estoy usando el siguiente comando bash clásico para encontrar todos los archivos que contienen alguna cadena:

find . -type f | xargs grep "something" 

Tengo una gran cantidad de archivos, en múltiples profundidades .La primera aparición de «algo» es suficiente para mí, pero find continúa buscando y lleva mucho tiempo completar el resto de los archivos. Lo que me gustaría hacer es algo así como un «comentario» de grep para volver a buscar para que find podría dejar de buscar más archivos. ¿Es posible algo así?

Respuesta

Simplemente manténgalo dentro del ámbito de find:

find . -type f -exec grep "something" {} \; -quit 

Así es como funciona:

El -exec funcionará cuando el -type f será verdadero. Y debido a que grep devuelve 0 (éxito / verdadero) cuando tiene una coincidencia, el -quit se activará.

Respuesta

find -type f | xargs grep e | head -1 

hace exactamente eso: cuando head termina, el elemento intermedio de la tubería se notifica con una» tubería rota «, termina a su vez y notifica a la find. Debería ver un aviso como

xargs: grep: terminated by signal 13 

que confirma esto.

Comentarios

  • +1 para la explicación y la alternativa, aunque la otra respuesta me parece más elegante, ya que es más autosuficiente

Responder

Para hacer esto sin cambiar las herramientas: (Me encantan los xargs)

#!/bin/bash find . -type f | # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20 # grep -m1: show just on match per file # grep --line-buffered: multiple matches from independent grep processes # will not be interleaved xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >( # Error output (stderr) is redirected to this command. # We ignore this particular error, and send any others back to stderr. grep -v "^xargs: .*: terminated by signal 13$" >&2 ) | # Little known fact: all `head` does is send signal 13 after n lines. head -n 1 

Comentarios

  • +1 nunca supo que xargs tendría tales capacidades de multitarea – ¡gracias por otros comentarios también! 🙂

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *