
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 *.json2
no 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 .ml
arquivo correspondente ao nome do caminho. Se não houver, seu curl
comando 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, find
atua 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: