Wie verwende ich zsh, um Ergebnisse von einem Befehl zum anderen zu leiten (in einer Schleife)?

macOS 10.14.6
zsh 5.8
jq 1.6

Ich habe eine Situation, in der ich eine Reihe von .vitalDateien habe, bei denen es sich um getarnte JSON-Dateien handelt. Ich möchte aus jeder Datei eine Information extrahieren, und ich habe herausgefunden, dass brew install jqich nach der Installation von jq mit ausführen kann, zum Beispiel ...

jq '.author' Analog_Bass__Lead.vital;

Das gibt mir...

"maniclout"

welches der richtige Autor für diesen Artikel ist.

Was ich tun möchte, ist, diesen Befehl über alle meine .vitalDateien, etwa 30 davon, in einer forSchleife auszuführen.

Ich kann die Dateien in Ordnung auflisten mit ...

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

Das Problem tritt auf, wenn ich versuche, eine Schleife zu konstruieren, die Folgendes ergeben würde ...

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

usw...

Das ist mein neuster Versuch (bitte nicht lachen!)...

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

Wie Sie sehen können, versuche ich, den Dateinamen gefolgt von in derselben Zeile auszugeben, daher das -n, und ich versuche, den Dateinamen in den jqBefehl einzufügen.

Die Ergebnisse sind ziemlich katastrophal!

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

Kann jemand sehen, was ich falsch mache?

Antworten (2)

Analysieren/interpretieren Sie die Ausgabe vonls nicht , zu viele Dinge können schief gehen. Ein einfacher Weg, um Ihr Ziel zu erreichen, wäre

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

was zum Beispiel immer noch fehlschlagen kann, wenn es Verzeichnisse gibt, die mit dem Muster übereinstimmen. Sie können dies überwinden, indem Sie verwenden

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

Sie können auch den vollen Weg gehen und laufen

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

( Informationen zur Funktionsweise finden Sie unter http://mywiki.wooledge.org/UsingFind#Complex_actions )

Kommentare sind nicht für längere Diskussionen gedacht; diese Konversation wurde in den Chat verschoben .

Sie könnten find verwenden, um eine Liste von .vitalDateien zu erhalten, und diese dann an Folgendes weiterleiten jq:

find *.vital | xargs jq '.author'