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.
find
pá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:
find
acepta múltiples-exec
porciones 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
-n
en 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]".$0
generalmente es el nombre del programa (ARGV[0]
).sh -c
esté entre comillas simples, no dobles. De$1
lo 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 | command
interior-exec
para 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/null
como segundo argumento algrep
comando con un-exec
parámetro:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
debería usar xargs :)
otro (trabajando en osx)
fuente
find
situaciones en las que el número de archivos coincidentes es demasiado grande para una línea de comando.-exec
es una forma de sortear este límite. La canalización a una empresa de servicios públicos pierde ese beneficio.xargs -n
existe para elegir el número de coincidencias por invocación.xargs -n 1 foocmd
se ejecutaráfoocmd {}
para cada partido.Una
find+xargs
respuestaEl siguiente ejemplo busca todos los
.html
archivos y crea una copia con la.BAK
extensió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.html
comillas de parámetros y--
después de locp
cual se indicacp
el final de los parámetros y el comienzo de los nombres de archivo reales.fuente