Encontre o arquivo json, verifique se foi gerado ou execute

Encontre o arquivo json, verifique se foi gerado ou execute

Quero encontrar arquivos *.json2, verificar se eles foram executados, se não, executar POST.

Eu tenho

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

Eu uso esse 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' \;

Quero executar apenas o arquivo que não possui extensão ml. THX

Responder1

Você já pensou em 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

Quanto a esse trailing bash, é um 'truque' que acabei de aprender nopágina da Wikipédia xargs. (Tem que estar lá ou o primeiro argumento não será processado.) Admito que nunca usei isso antes, mas testei com um comando echo e alguns arquivos de teste, e parece fazer o que você deseja.

Responder2

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

Isso encontraria todos os arquivos regulares cujos nomes correspondem ao padrão *.json2no diretório atual ou abaixo dele. Para lotes desses arquivos, um script de shell curto é executado. Este script testa, para cada nome de caminho fornecido por find, se existe um .mlarquivo correspondente ao nome do caminho. Se não houver, seu curlcomando será executado.

Isso poderia ser simplificado da seguinte forma, se todos os arquivos estiverem localizados apenas no diretório atual:

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

Observe que isso é essencialmenteexatamenteo mesmo loop do script chamado por find. A única diferença é que no primeiro exemplo, findatua como um gerador de nome de caminho para o loop, enquanto no exemplo mais curto, os nomes de caminho são gerados usando um padrão globbing (e somente a partir do diretório atual).

Relacionado:

informação relacionada