Buscar el archivo json, verificar si se generó o ejecutar

Buscar el archivo json, verificar si se generó o ejecutar

Quiero encontrar archivos *.json2, verificar si se ejecutan si no se ejecuta POST.

Tengo

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

Yo uso este comando

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' \;

Quiero ejecutar sólo el archivo que no tiene extensión ml. Gracias

Respuesta1

¿Has considerado usar 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

En cuanto a ese seguimientobash , es un "truco" que acabo de aprender en elpágina de wikipedia xargs. (Tiene que estar allí o el primer argumento no se procesa). Admito que nunca lo había usado antes, pero lo probé con un comando echo y algunos archivos de prueba, y parece hacer lo que quieres.

Respuesta2

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 {} +

Esto encontraría todos los archivos normales cuyos nombres de archivo coincidan con el patrón *.json2en o debajo del directorio actual. Para lotes de estos archivos, se ejecuta un breve script de shell. Este script prueba, para cada nombre de ruta que le proporciona find, si hay un .mlarchivo correspondiente al nombre de ruta. Si no es así, curlse ejecuta su comando.

Esto podría simplificarse a lo siguiente si todos los archivos se encuentran solo en el directorio actual:

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

Tenga en cuenta que esto es esencialmenteexactamenteel mismo bucle que en el script llamado por find. La única diferencia es que en el primer ejemplo, findactúa como un generador de nombres de ruta para el bucle, mientras que en el ejemplo más corto, los nombres de ruta se generan usando un patrón global (y solo desde el directorio actual).

Relacionado:

información relacionada