sheet - ¿Cómo incluyo una tubería? en mi linux find-exec comando?
the linux command line epub (4)
El trabajo de interpretar el símbolo de tubería como una instrucción para ejecutar múltiples procesos y canalizar la salida de un proceso a la entrada de otro proceso es responsabilidad del shell (/ bin / sh o equivalente).
En su ejemplo, puede optar por usar su caparazón de nivel superior para realizar la tubería de la siguiente manera:
find -name ''file_*'' -follow -type f -exec zcat {} /; | agrep -dEOE ''grep''
En términos de eficiencia, este resultado cuesta una invocación de hallazgo, numerosas invocaciones de zcat y una invocación de agrep.
Esto daría como resultado que solo se generara un único proceso de agrep que procesaría toda la producción producida por numerosas invocaciones de zcat.
Si por algún motivo desea invocar agrep varias veces, puede hacer:
find . -name ''file_*'' -follow -type f /
-printf "zcat %p | agrep -dEOE ''grep''/n" | sh
Esto construye una lista de comandos usando pipes para ejecutar, luego los envía a un nuevo shell para que realmente se ejecuten. (Omitir el "| sh" final es una buena manera de depurar o realizar ejecuciones en seco de líneas de comando como esta).
En términos de eficiencia, este resultado cuesta una invocación de find, una invocación de sh, numerosas invocaciones de zcat y numerosas invocaciones de agrep.
La solución más eficiente en términos de número de invocaciones de comando es la sugerencia de Paul Tomblin:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE ''grep''
... que cuesta una invocación de find, una invocación de xargs, unas pocas invocaciones de zcat y una invocación de agrep.
Esto no está funcionando. ¿Se puede hacer esto en find? ¿O necesito xargs?
find -name ''file_*'' -follow -type f -exec zcat {} /| agrep -dEOE ''grep'' /;
También puede canalizar a un ciclo while que puede realizar múltiples acciones en el archivo que find
localiza. Así que aquí hay uno para buscar en archivos jar
para un determinado archivo de clase java en la carpeta con una gran distribución de 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 ciclo while contiene varios comandos que hacen referencia al nombre del archivo pasado, separados por punto y coma, y estos comandos pueden incluir pipes. Entonces, en ese ejemplo hago eco del nombre del archivo coincidente y, luego, enumero lo que está en el filtrado del archivo para un nombre de clase determinado. La salida se ve así:
/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 / databinding / observable / list / IObservableList .class /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) realmente hace que el nombre de clase fgrep
negrita ya que fgrep
resalta la cadena coincidente; esto hace que sea realmente fácil escanear la lista de cientos de archivos jar
que se buscaron y ver fácilmente cualquier coincidencia.
en Windows puede hacer lo mismo con:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
tenga en cuenta que en eso en Windows, el separador de comandos es ''&'' no '';'' y que el ''@'' suprime el eco del comando para dar una salida ordenada como la salida de Linux de encontrar arriba; aunque findstr
no hace que la cadena findstr
sea negrita, por lo que debe acercarse un poco más a la salida para ver el nombre de la clase coincidente. Resulta que el comando "para" de Windows conoce bastantes trucos como bucles a través de archivos de texto ...
disfrutar
la solución es fácil: ejecutar vía sh
... -exec sh -c "zcat {} | agrep -dEOE ''grep'' " /;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE ''grep''