Найти файл json, проверить, сгенерирован ли он или выполнить

Найти файл json, проверить, сгенерирован ли он или выполнить

Я хочу найти файлы *.json2, проверить, выполняются ли они, если нет, выполнить POST.

У меня есть

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

Я использую эту команду

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

Я хочу выполнить только файл без расширения ml. Спасибо

решение1

Вы рассматривали возможность использования 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

Что касается этого отставания bash, это «трюк», которому я только что научился наxargs страница википедии. (Он должен быть там, иначе первый аргумент не будет обработан.) Признаюсь, я никогда раньше этим не пользовался, но я протестировал его с помощью команды echo и нескольких тестовых файлов, и, похоже, он делает то, что нужно.

решение2

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

Это найдет все обычные файлы, имена которых соответствуют шаблону *.json2в текущем каталоге или ниже. Для пакетов этих файлов выполняется короткий скрипт оболочки. Этот скрипт проверяет, для каждого имени пути, указанного ему find, есть ли .mlфайл, соответствующий имени пути. Если нет, curlвыполняется ваша команда.

Это можно упростить до следующего вида, если все файлы находятся только в текущем каталоге:

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

Обратите внимание, что это по сутиточнотот же цикл, что и в скрипте, вызываемом find. Единственное отличие состоит в том, что в первом примере findдействует как генератор имени пути для цикла, тогда как в более коротком примере имена путей генерируются с использованием шаблона подстановки (и только из текущего каталога).

Связанный:

Связанный контент