
Я хочу найти файлы *.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
действует как генератор имени пути для цикла, тогда как в более коротком примере имена путей генерируются с использованием шаблона подстановки (и только из текущего каталога).
Связанный: