En Windows, si quisiera encontrar una cadena en todos los archivos en todos los subdirectorios, haría algo como
findstr /C:"the string" /S *.h
Sin embargo, en Linux (por ejemplo, Ubuntu) no he encontrado ninguna otra manera que algún comando canalizado la participación find
, xargs
y grep
(un ejemplo es en esta página: ? ¿Cómo puedo recurrentemente grep a través de subdirectorios ). Sin embargo, mi pregunta es diferente: ¿hay algún comando único incorporado que funcione a través de esta magia, sin tener que escribir mi script de shell?
*
a'*'
: "Es necesario citar el último comodín para evitar errores cuando algún nombre de archivo comienza con -"-Msomething
, o a unaGREP_OPTIONS
configuración.grep -r searchpattern /path/to/start/in
Donde
/path/to/start/in/
puede ser solo ".
" para el directorio actual.fuente
No.
find -name \*.h -print0 | xargs -0 grep -l 'the regex'
es tan mágico como se pone.fuente
-r
opción. No hay necesidad de artillería pesada.xargs
agrega solo ruido. Usofind -name \*.h -execdir grep -l 'the regex {} +
Para ser pedante, no, no puedes asumir que tal orden existe .
Hay muchas implementaciones diferentes de Unix, y cada una tiene sus peculiaridades diferentes. POSIX, el denominador común (y lo más parecido a un estándar en Unices) no especifica dicha opción para
grep
.Como se mencionó en otras respuestas, la implementación de GNU
grep
tiene una opción no estándar que hace lo que usted desea. Si bien esta implementación particular puede ser común en los sistemas Linux, no puede asumir su disponibilidad en ningún Unix, incluso en algunos sistemas Linux.Finalmente, debo mencionar que es la filosofía de Unix favorecer la combinación de varios programas primitivos, sobre el uso de un gran ejecutable monolítico que intenta hacer todo de una vez.
En su caso, rastrear el sistema de archivos y combinar expresiones regulares en una secuencia son dos tareas separadas. Es normal tratar cada uno en un programa separado.
fuente
Para encontrar una cadena del directorio dado, use el siguiente comando
Por ejemplo:
fuente
grep
puede tomar más de un archivo como argumentos, por lo que debe usarlo en+
lugar de\;
evitar ejecutar unagrep
invocación por archivo que es bastante ineficiente.-name '*'
restringe a los archivos cuyo nombre es texto válido en la configuración regional actual (find
al menos en algunas implementaciones), pero los otros componentes del directorio aún pueden contener secuencias de bytes que no forman caracteres válidos. Si su intención con eso-name '*'
era asegurarse de que la salida es texto válido (al omitir los archivos con nombres incorrectos), preferiría usarfind ... ! -name '*' -prune -o -exec grep ... {} +
, que también evitaríafind
descender a directorios con nombres incorrectos.