При первом вызове API возвращается ответ JSON, который включает в себя множество ссылок. Я хочу свернуть каждую ссылку и загрузить файл в местоположение на основе последних трех сегментов пути.
Например, если URL-адрес https://data.ninjakiwi.com/btd6/races/The_Olympics_lzlqex8k/metadata, я хочу загрузить файл на races/The_Olympics_lzlqex8k/metadata.json. Очевидно, cut не может обрабатывать индексацию с конца, поэтому я жестко запрограммировал количество косых черт (включая 2 в https://), которые нужно пропустить. Я придумал пример команды. Есть ли более элегантный способ написать это? xargs показал мне, что это, вероятно, возможно без цикла и меньшего использования подоболочки.
for url in $(curl https://data.ninjakiwi.com/btd6/races | jq -r '.body [] | .leaderboard, .metadata'); do
echo $url; curl --create-dirs -o $(echo $url | cut -d/ -f5-).json $url; done
Интересные строковые функции bash, которые я никогда раньше не использовал. Есть ли coreutil, который может вернуть последние три части пути?
Если вы хотите придерживаться cut, rev строки, cut первых трех частей и rev вернуть результат. Но я не вижу в этом никакого преимущества.
Я видел трюк с оборотами в другом посте. Это действительно некрасиво, ведь что-то обрезанное должно поддерживаться.
Вы всегда можете написать свою собственную функцию, обеспечивающую это.
Что касается Есть ли coreutil, который может вернуть последние 3 части пути? - да, sed, awk и grep -o все могут это сделать.
Я голосую за закрытие этого вопроса, потому что на плакате не использовался shellcheck.net , как указано в теге bash.
@EdMorton, это законная причина? То, о чем я спрашиваю, не может быть исправлено предложениями Shellcheck.
@awr да, потому что вы заставляете тех из нас, кто читает ваш сценарий, разбираться с проблемами, о которых вам могла бы сообщить оболочка, и вы могли бы исправить, задаваясь вопросом по каждой проблеме, какое влияние она может оказать и как она может способствовать вашей проблеме. Всегда просто очищайте то, что можете, самостоятельно, прежде чем просить кого-либо помочь вам с вашим кодом, чтобы сделать его как можно быстрее и проще, чтобы как можно больше людей могли вам помочь, чтобы у вас были лучшие шансы быстро получить лучшее решение. к вашей проблеме.





Вам не нужна петля. Это должно работать:
curl https://data.ninjakiwi.com/btd6/races |
jq -r '.body[] | .leaderboard, .metadata | "url = "+., "output = "+((./"/")[-3:] | join("/"))+".json"' |
curl -Z -K - --create-dirs
Это умно. Я не знал, что jq может разделять и объединять строки таким образом. Я не рассматривал параллель и знал о -K, но никогда не думал, что jq может подать аргументы на блюде. Вы мне много показали, и у ТАК всегда есть чему меня научить.
@qwr Рад, что помог. Добрый день
Повторное индексирование
cutс конца: попробуйте установитьbase='https://data.ninjakiwi.com/btd6', затем используйтеcurl "$base/races", а затемcurl --create-dirs -o "${url#$base/}.json" "$url".