下载 JSON 文件中的 URL 并使用特定的命名模式保存

Download URLs in JSON file and save with a specific naming pattern

我想下载图片并按索引重命名它们

我唯一拥有的是一个 jsonlines 文件,如下所示:

{"image": 136, "url": "https://enkistroy.ru/800/600/https/avatars.mds.yandex.net/get-zen_doc/1852570/pub_5dbb15dfba281e00b14b4174_5dbb2300e3062c00b072ecce/scale_1200"}
{"image": 137, "url": "https://forums.cdprojektred.com/index.php?attachments/unbenannt-jpg.6709974/"}
{"image": 138, "url": "https://64.media.tumblr.com/1309f93790c53ccacc333b28d12dac66/tumblr_p9fqienz291x5m66ko1_r1_1280.png"}
{"image": 139, "url": "https://i.pinimg.com/originals/4c/21/0c/4c210ca963cf4d52636615ac08126b05.jpg"}

我试过使用 jq tool, grep, wget and curl

egrep -o 'https:[^\"]*jpg' images.json | xargs -n 1 curl -O

这只会下载带有 jpg 文件的 https 链接而不重命名它们

也许编写 python 脚本会更容易?

编辑:

试过了,不确定如何用 curl 重命名? curl -O "#1.jpg"

jq -r '.url' images.json | parallel curl -O

听起来你想要这样的东西:

$ cat tst.sh
#!/usr/bin/env bash

idx=0
while IFS= read -r url; do
    (( idx++ ))
    sfx="${url##*.}"
    case "$sfx" in
        png ) ;;
        * ) sfx='jpg' ;;
    esac
    echo curl "$url" -o "${idx}.${sfx}"
done < <(jq -r '.url' "${1:-images.json}")

$ ./tst.sh
curl https://enkistroy.ru/800/600/https/avatars.mds.yandex.net/get-zen_doc/1852570/pub_5dbb15dfba281e00b14b4174_5dbb2300e3062c00b072ecce/scale_1200 -o 1.jpg
curl https://forums.cdprojektred.com/index.php?attachments/unbenannt-jpg.6709974/ -o 2.jpg
curl https://64.media.tumblr.com/1309f93790c53ccacc333b28d12dac66/tumblr_p9fqienz291x5m66ko1_r1_1280.png -o 3.png
curl https://i.pinimg.com/originals/4c/21/0c/4c210ca963cf4d52636615ac08126b05.jpg -o 4.jpg

以上假设任何不以 .png 结尾的 URL 都是 JPEG,根据您所知道的任何规则进行按摩以识别要用作文件的图像类型后缀或将 curl 限制为仅 JPEG 文件。

当您完成测试并想要实际执行 curl 时,显然删除 echo

以图片数据为索引(见下方评论):

$ cat tst.sh
#!/usr/bin/env bash

while read -r idx url; do
    sfx="${url##*.}"
    case "$sfx" in
        png ) ;;
        * ) sfx='jpg' ;;
    esac
    echo curl "$url" -o "${idx}.${sfx}"
done < <( jq -j '.image, " ", .url, "\n"' "${1:-images.json}" )

$ ./tst.sh
curl https://enkistroy.ru/800/600/https/avatars.mds.yandex.net/get-zen_doc/1852570/pub_5dbb15dfba281e00b14b4174_5dbb2300e3062c00b072ecce/scale_1200 -o 136.jpg
curl https://forums.cdprojektred.com/index.php?attachments/unbenannt-jpg.6709974/ -o 137.jpg
curl https://64.media.tumblr.com/1309f93790c53ccacc333b28d12dac66/tumblr_p9fqienz291x5m66ko1_r1_1280.png -o 138.png
curl https://i.pinimg.com/originals/4c/21/0c/4c210ca963cf4d52636615ac08126b05.jpg -o 139.jpg

也许编写 python 脚本会更容易?

Python 有内置模块 imghdr 如果你有图像文件,但不知道是什么格式,它会派上用场。假设您下载了 https://64.media.tumblr.com/1309f93790c53ccacc333b28d12dac66/tumblr_p9fqienz291x5m66ko1_r1_1280.png 并将其保存在名称 138 下,以检测它实际上是什么格式的图像 在同一目录中启动 python 并执行

import imghdr
imgformat = imghdr.what("138")
print(imgformat)

输出

jpeg

内置 os 模块允许轻松更改名称以包含此扩展名,即:

import imghdr
import os
filename = "138"
imgformat = imghdr.what("138")
if imgformat:
    os.rename(filename, filename + "." + imgformat)

注意使用if imgformat:所以当图像格式无法识别时没有操作