Esto no esta funcionando. ¿Se puede hacer esto en find? ¿O necesito xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
fuente
Esto no esta funcionando. ¿Se puede hacer esto en find? ¿O necesito xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
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 elegir 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, estos resultados cuestan una invocación de búsqueda, numerosas invocaciones de zcat y una invocación de agrep.
Esto daría como resultado un solo proceso de concordancia que procesaría toda la salida producida por numerosas invocaciones de zcat.
Si por alguna razón desea invocar agrep varias veces, puede hacer lo siguiente:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
Esto construye una lista de comandos usando tuberías 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 ejecutar ejecuciones secas de líneas de comando como esta).
En términos de eficiencia, este resultado cuesta una invocación de búsqueda, 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 comandos 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 búsqueda, una invocación de xargs, algunas invocaciones de zcat y una invocación de agrep.
-exec sh -c "… | … " \;
.la solución es fácil: ejecutar mediante sh
fuente
-c
opción. De lo contrario, recibirá unNo such file or directory
mensaje de error desconcertante .find -type f -name '*.mdds' -exec sh -c "echo {} | sed -e 's/_[0-9]\+//g' | xargs mv {}" \;
fuente
También puede canalizar a un
while
bucle que puede realizar múltiples acciones en el archivo quefind
localiza. Así que aquí hay uno para buscar en losjar
archivos un archivo de clase java dado en una carpeta con una gran distribución dejar
archivosel punto clave es que el
while
bucle contiene múltiples comandos que hacen referencia al nombre del archivo pasado separado por punto y coma y estos comandos pueden incluir tuberías. Entonces, en ese ejemplo, hago eco del nombre del archivo coincidente y luego enumero lo que está en el filtro de archivo para un nombre de clase dado. El resultado 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 coincidente sea en negrita cuando
fgrep
resalta la cadena coincidente; esto hace que sea realmente fácil escanear la lista de cientos dejar
archivos que se buscaron y ver fácilmente cualquier coincidencia.en windows puedes hacer lo mismo con:
tenga en cuenta que en Windows el separador de comandos es '&' no ';' y que la '@' suprime el eco del comando para dar una salida ordenada al igual que la salida de búsqueda de Linux anterior; aunque
findstr
no está en negrita la cadena coincidente, por lo que debe mirar un poco más cerca de la salida para ver el nombre de la clase coincidente. Resulta que el comando 'for' de Windows conoce bastantes trucos, como recorrer los archivos de texto ...disfrutar
fuente
Descubrí que ejecutar un comando de shell de cadena (sh -c) funciona mejor, por ejemplo:
fuente
Si está buscando una alternativa simple, esto se puede hacer usando un bucle:
o, de forma más general y fácil de entender:
y reemplace cualquier {} por $ i en YOUR_EXEC_COMMAND_AND_PIPES
fuente