103 votos

¿Cómo puedo incluir un tubo | en mi linux find-comando exec?

Esto no está funcionando. Se puede hacer esto en encontrar? O necesito xargs?

find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;

121voto

flolo Puntos 8757

la solución es fácil: ejecutar a través de la sh

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;

76voto

Rolf W. Rasmussen Puntos 803

El trabajo de interpretar el símbolo de la tubería como una instrucción de ejecutar varios procesos y canalizar la salida de un proceso a la entrada de otro proceso es la responsabilidad de la shell (/bin/sh o equivalente).

En su ejemplo, usted puede usar su superior nivel de shell para realizar el tendido de tuberías así:

find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'

En términos de eficiencia, los resultados de esta costos de una invocación de encontrar, numerosas invocaciones de zcat, y una invocación de agrep.

Esto resultaría en un solo agrep proceso generado a lo que sería el proceso de la salida producida por numerosas invocaciones de zcat.

Si por alguna razón no te gustaría invocar agrep varias veces, usted puede hacer:

find . -name 'file_*' -follow -type f \
    -printf "zcat %p | agrep -dEOE 'grep'\n" | sh

Esto construye una lista de comandos a través de tuberías a ejecutar, que luego se envían a un nuevo shell para ser realmente ejecutado. (La omisión de la final "| sh" es una buena forma de depurar o realizar recorridos de las líneas de comando como este.)

En términos de eficiencia, los resultados de esta costos de una invocación de encontrar, una invocación de peces, numerosas invocaciones de zcat y numerosas invocaciones de agrep.

La solución más eficiente en términos de número de invocaciones de comandos es la sugerencia de Pablo Tomblin:

find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

... que cuesta una invocación de encontrar, una invocación de xargs, un par de invocaciones de zcat y una invocación de agrep.

12voto

Paul Tomblin Puntos 83687
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

6voto

raphaelfournier Puntos 71

Yo estaba en el caso de que el cartel original, y el elegido respuesta no puede ser satisfactoria, puesto que usted no puede estar dispuesta para canalizar todo lo que zcat flujo a través de la tubería sin distinción de archivo que se origina a partir de.

Así que creo que el ... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \; es para ser citados y votó, en mi humilde opinión.

4voto

simbo1905 Puntos 911

También puede tubo a un bucle while, que pueden realizar múltiples acciones sobre el archivo que buscar localiza. Así que aquí está uno para mirar en los archivos jar para un determinado archivo de clase java en la carpeta con una gran distro de muchos archivos jar

find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done

el punto clave es que el bucle while contiene varios comandos en referencia a la aprobada en el nombre de archivo separadas por punto y coma y estos comandos pueden comprender tuberías. Así que en ese caso me hago eco el nombre del archivo de correspondencia, a continuación, la lista de lo que está en el archivo de filtrado para un determinado nombre de la clase. Se ve el resultado:

/usr/lib/eclipse/plugins/org.eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar /usr/lib/eclipse/plugins/org.eclipse.core.databinding.observable_1.2.0.M20090902-0800.jar org/eclipse/core/enlace/observable/lista/IObservableList.clase /usr/lib/eclipse/plugins/org.eclipse.search.source_3.5.1.r351_v20090708-0800.jar /usr/lib/eclipse/plugins/org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/eclipse/plugins/org.eclipse.cvs.source_1.0.400.v201002111343.jar /usr/lib/eclipse/plugins/org.eclipse.help.appserver_3.1.400.v20090429_1800.jar

en mi shell bash (xubuntu10.04/xfce) lo que realmente hace que la coincidencia de nombre de la clase audaz como el fgrep pone de relieve la coincidencia de cadena; esto hace que sea muy fácil de escanear hacia abajo en la lista de cientos de archivos jar que se buscó y fácilmente ver los partidos en los archivos.

si usted está en windows, puede hacer lo mismo para buscar un nombre de clase en una butch de archivos jar con

for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList

tenga en cuenta que en que en windows el separador de comandos es ' y' no ';' y que la '@' suprime el eco de la ejecución del comando para dar un orden de salida como el de linux encontrar la salida anterior; aunque findstr no es hacer la cadena coincidente en negrita lo que tiene que buscar un poco más de cerca a la salida para ver la coincidencia de nombre de la clase. Resulta que el windows 'para' comando sabe muy bien como un par de trucos tales como un bucle a través de archivos de texto...

disfrutar

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X