Suchen Sie nach einer JSON-Datei, prüfen Sie, ob sie generiert wurde, oder führen Sie sie aus

Suchen Sie nach einer JSON-Datei, prüfen Sie, ob sie generiert wurde, oder führen Sie sie aus

Ich möchte *.json2-Dateien finden und prüfen, ob sie ausgeführt werden, wenn nicht, POST ausführen.

Ich habe

1.json2
2.json2  2.json2.ml
3.json2  3.json2.ml

Ich verwende diesen Befehl

find . -type f -name '*.json2' | if [{}.ml]; then -exec sh -c 'curl -X POST -H "Content-Type: application/json" -d @{} https://api.myweb.com/api > {}.ml' \;

Ich möchte nur die Datei ausführen, die keine ML-Erweiterung hat. Danke

Antwort1

Haben Sie über die Verwendung nachgedacht xargs?

find . -type f -name '*.json2' | xargs bash -c 'for fname; do if [ ! -e ${fname}.ml ]; then curl -X POST -H "Content-Type: application/json" -d @${fname} https://api.myweb.com/api > ${fname}.ml; fi; done' bash

Was das Trailing betrifft bash, es ist ein 'Trick', den ich gerade gelernt habe auf derxargs Wikipedia-Seite. (Es muss da sein, sonst wird das erste Argument nicht verarbeitet.) Ich gebe zu, dass ich das noch nie zuvor verwendet habe, aber ich habe es mit einem Echo-Befehl und einigen Testdateien getestet und es scheint das zu tun, was Sie wollen.

Antwort2

find . -type f -name '*.json2' -exec sh -c '
    for pathname; do
        [ -e "$pathname.ml" ] && continue
        curl -X POST -H "Content-Type: application/json" -d @"$pathname" https://api.myweb.com/api >"$pathname.ml"
    done' sh {} +

Damit werden alle regulären Dateien gefunden, deren Dateinamen dem Muster *.json2im aktuellen Verzeichnis oder darunter entsprechen. Für Stapel dieser Dateien wird ein kurzes Shell-Skript ausgeführt. Dieses Skript prüft für jeden von angegebenen Pfadnamen find, ob eine .mlDatei vorhanden ist, die dem Pfadnamen entspricht. Wenn dies nicht der Fall ist, curlwird Ihr Befehl ausgeführt.

Dies könnte wie folgt vereinfacht werden, wenn sich alle Dateien nur im aktuellen Verzeichnis befinden:

for pathname in ./*.json2; do
    [ -e "$pathname.ml" ] && continue
    curl -X POST -H "Content-Type: application/json" -d @"$pathname" https://api.myweb.com/api >"$pathname.ml"
done

Beachten Sie, dass dies im Wesentlichengenaudieselbe Schleife wie im von aufgerufenen Skript find. Der einzige Unterschied besteht darin, dass im ersten Beispiel findals Pfadnamengenerator für die Schleife fungiert, während im kürzeren Beispiel die Pfadnamen mithilfe eines Globbing-Musters (und nur aus dem aktuellen Verzeichnis) generiert werden.

Verwandt:

verwandte Informationen