4 votes

Comment utiliser zsh pour transmettre les résultats d'une commande à une autre (while in a loop) ?

macOS 10.14.6
zsh 5.8
jq 1.6

J'ai une situation où j'ai un tas de .vital qui sont des fichiers JSON déguisés. Je veux extraire un élément d'information de chaque fichier, et j'ai découvert qu'après avoir installé jq à l'aide de brew install jq je peux courir, par exemple...

jq '.author' Analog_Bass__Lead.vital;

Cela me donne...

"maniclout"

qui est l'auteur correct pour cet élément.

Ce que j'aimerais faire, c'est lancer cette commande sur tous mes .vital fichiers, environ 30, dans un for boucle.

Je peux lister les fichiers sans problème en utilisant...

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

Le problème survient lorsque j'essaie de construire une boucle qui donnerait ce qui suit...

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

et ainsi de suite...

Voici ma dernière tentative (s'il vous plaît, ne riez pas !)...

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

Comme vous pouvez le constater, j'essaie d'imprimer le nom du fichier, suivi de, sur la même ligne, d'où l'utilisation de l'option -n et j'essaie d'envoyer le nom du fichier dans le fichier de données de l'application jq commandement.

Les résultats sont assez désastreux !

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

Quelqu'un peut-il voir ce que je fais mal ?

6voto

nohillside Points 82672

Faites no analyser/interpréter la sortie de ls trop de choses peuvent mal tourner. Un moyen simple d'atteindre votre objectif serait

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

ce qui peut encore échouer s'il y a des répertoires correspondant au motif par exemple. Vous pouvez surmonter ce problème en utilisant

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

Vous pouvez aussi aller jusqu'au bout et lancer

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

(voir http://mywiki.wooledge.org/UsingFind#Complex_actions pour savoir comment cela fonctionne)

1voto

jpm Points 31

Vous pouvez utiliser find pour obtenir une liste de .vital puis de le diriger vers jq :

find *.vital | xargs jq '.author'

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X