
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 *.json2
en 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 .ml
archivo correspondiente al nombre de ruta. Si no es así, curl
se 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, find
actú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: