
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 *.json2
im 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 .ml
Datei vorhanden ist, die dem Pfadnamen entspricht. Wenn dies nicht der Fall ist, curl
wird 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 find
als 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: