Estoy tratando de usar find -exec con múltiples comandos sin ningún éxito. ¿Alguien sabe si comandos como los siguientes son posibles?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
Básicamente, estoy tratando de imprimir la última línea de cada archivo txt en el directorio actual e imprimir al final de la línea, una coma seguida del nombre del archivo.

findpágina del manual:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.unixhelp.ed.ac.uk/CGI/man-cgi?findRespuestas:
findacepta múltiples-execporciones al comando. Por ejemplo:Tenga en cuenta que en este caso el segundo comando solo se ejecutará si el primero regresa con éxito, como lo menciona @Caleb. Si desea que ambos comandos se ejecuten independientemente de su éxito o fracaso, puede usar esta construcción:
fuente
-nen algunas de las otras respuestas para suprimir la nueva línea generada por echo, lo cual es útil si su segundo comando produce solo una línea de salida y desea que sean más fáciles de leer.fuente
... -exec bash -c ...lugar de... -exec sh -c ....{}en el código de shell. Ver unix.stackexchange.com/questions/156008/…Uno de los siguientes:
fuente
$0. Intente esto con "foobar" en lugar de "_":find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;- la salida: "[foobar] [/ usr / bin / find]".$0generalmente es el nombre del programa (ARGV[0]).sh -cesté entre comillas simples, no dobles. De$1lo contrario, está en el alcance incorrecto.'$1'con comillas dobles siempre que escape de la variable ("\$1"). También puedes escapar de otros personajes ("\"").Otra forma es así:
en una linea
multiple_cmd()" - es una funciónexport -f multiple_cmd": lo exportará para que cualquier otra subshell pueda verlofind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;" - encuentra que ejecutará la función en tu ejemploDe esta forma, multiple_cmd puede ser tan largo y complejo como lo necesite.
Espero que esto ayude.
fuente
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;Hay una manera más fácil:
Alternativamente:
fuente
zcat $file | wc -l"; hecho funciona, así que gracias!`para hacer que use barras invertidas de la siguiente manera:\`(aún así, esa es otra buena razón para usar$()en su lugar).No sé si puede hacer esto con find, pero una solución alternativa sería crear un script de shell y ejecutar esto con find.
lastline.sh:
Hacer el script ejecutable
Uso
find:fuente
La primera respuesta de Denis es la respuesta para resolver el problema. Pero, de hecho, ya no es un hallazgo con varios comandos en un solo ejecutivo, como sugiere el título. Para responder a un ejecutivo con varios comandos, tendremos que buscar otra cosa para resolver. Aquí hay un ejemplo:
Mantenga las últimas 10000 líneas de archivos .log que se han modificado en los últimos 7 días usando 1 comando exec usando varias referencias {}
1) vea qué hará el comando en qué archivos:
2) Hazlo: (nota no más "\>" pero solo ">" esto es necesario)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;fuente
Gracias a Camilo Martin, pude responder una pregunta relacionada:
Lo que quería hacer era
que no funcionó Sin embargo,
funciona, así que gracias!
fuente
Extendiendo la respuesta de @Tinker,
En mi caso, necesitaba hacer un
command | command | commandinterior-execpara imprimir tanto el nombre del archivo como el texto encontrado en los archivos que contienen un texto determinado.Pude hacerlo con:
el resultado es:
fuente
/dev/nullcomo segundo argumento algrepcomando con un-execparámetro:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;debería usar xargs :)
otro (trabajando en osx)
fuente
findsituaciones en las que el número de archivos coincidentes es demasiado grande para una línea de comando.-execes una forma de sortear este límite. La canalización a una empresa de servicios públicos pierde ese beneficio.xargs -nexiste para elegir el número de coincidencias por invocación.xargs -n 1 foocmdse ejecutaráfoocmd {}para cada partido.Una
find+xargsrespuestaEl siguiente ejemplo busca todos los
.htmlarchivos y crea una copia con la.BAKextensión añadida (por ejemplo,1.html>1.html.BAK).Comando único con múltiples marcadores de posición
Múltiples comandos con múltiples marcadores de posición
Este comando también funcionará con archivos que comiencen con un guión o contengan espacios como, por ejemplo, entre
-my file.htmlcomillas de parámetros y--después de locpcual se indicacpel final de los parámetros y el comienzo de los nombres de archivo reales.fuente