4 votos

¿Cómo puedo utilizar zsh para canalizar los resultados de un comando a otro (en un bucle)?

macOS 10.14.6
zsh 5.8
jq 1.6

Tengo una situación en la que tengo un montón de .vital que son archivos JSON disfrazados. Quiero extraer una información de cada archivo, y he averiguado que después de instalar jq usando brew install jq Puedo correr, por ejemplo...

jq '.author' Analog_Bass__Lead.vital;

Esto me da...

"maniclout"

que es el autor correcto para ese artículo.

Lo que me gustaría hacer es ejecutar este comando sobre todos mis .vital archivos, unos 30, en un for bucle.

Puedo listar los archivos bien usando...

for f in $(ls *.vital);
do
  echo $f
done;

El problema viene cuando intento construir un bucle que dé lo siguiente...

Analog_Bass__Lead.vital "maniclout"
Blackhole_Dimension.vital "Cobranix"

y así sucesivamente...

Este es mi último intento (¡por favor, no se rían!)...

for f in $(ls *.vital);
do
  echo $f;
  echo -n $f | jq ‘.author’
done;

Como puedes ver, estoy intentando imprimir el nombre del archivo, seguido de, en la misma línea, de ahí el -n y estoy tratando de canalizar el nombre del archivo en el jq comando.

Los resultados son bastante desastrosos.

ANALOG_PAD_-_6.vital
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
‘.author’
jq: 1 compile error
Analog_Bass__Lead.vital
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
‘.author’
jq: 1 compile error
Atomosphere_Lead.vital
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
‘.author’
jq: 1 compile error

¿Alguien puede ver lo que estoy haciendo mal?

6voto

Haga no parsear/interpretar la salida de ls demasiadas cosas pueden salir mal. Una forma sencilla de lograr su objetivo sería

for f in *.vital; do
    echo -n "$f: "
    jq '.author' "$f"
done

lo cual puede fallar si hay directorios que coinciden con el patrón, por ejemplo. Esto se puede solucionar utilizando

for f in *.vital; do
    [[ -f "$f" ]] || continue
    echo -n "$f: "
    jq '.author' "$f"
done

También puedes ir a por todas y ejecutar

find . -maxdepth 1 -type f -name '*.vital' \
     -exec sh -c 'echo -n "$1"; jq ".author" "$1"' _ {} \;

(ver http://mywiki.wooledge.org/UsingFind#Complex_actions para saber cómo funciona)

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado al chat .

1voto

jpm Puntos 31

Puedes usar find para obtener una lista de .vital y luego lo canaliza a jq :

find *.vital | xargs jq '.author'

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X