Image Downloader: Baixando Imagens de Sites
18 Nov 2025 (updated: 18 Nov 2025 )
Se tem uma coisa que eu estava frustrado era com a maneira em que eu guardava as minhas referências para usar futuramente. Era um processo muito chato, de ter que “etiquetar” as imagens, no formato de “artista-plataforma-ID”.
E salvava nesse formato para facilitar a busca da imagem original, pois assim eu teria o artista, a plataforma e o ID que aquela plataforma deu para o Post. Com isso, pensei num Script para facilitar esse trabalho.
O Princípio do Script
Em todo site, as imagens tem um link para salvamento; esse link nunca está tão amigável assim; e o link da postagem que todo mundo vê. A ideia é usar os dois links: O das imagens e o do post.
O Link das Imagens é usado, principalmente, para o curl baixar as imagens para o disco, e o do Post é usado, em via de regra, para montar o nome do arquivo. E é esse o princípio desse Script.
Começando pelo Básico
Além da Shebang, o Script começa com as variáveis. Inicialmente, são definidas três variáveis: tempImg, onde ficam os dados das imagens a serem tratadas, picFolder, que é basicamente onde fica a pasta de Imagens do Usuário e a idFolder, que é a pasta em que o Image Downloader irá baixar as imagens.
tempImg="/tmp/imagedownloader.txt"
picFolder="$(xdg-user-dir PICTURES)"
idFolder="$picFolder/ImageDownloader"
Com isso, vem a primeira função, que á e de Limpar as Varáveis. Isso é necessário para evitar erros no curl, pois pode ser que o Script seja executado sem dados, e com isso o curl dá erro.
clearVariables () {
urlImage=""
urlPost=""
filename=""
rm $tempImg
}
Exibindo o YAD e pegando as primeiras informações
A função principal começa chamando a função para limpar as variáveis, e depois exibe um diálogo do YAD pedindo para entrar com a URL da Imagem e do Post.
clearVariables
yad --title="Image Downloader" --text="Favor, entrar com detalhes" \
--form --separator="\n" \
--field="URL da Imagem" \
--field="URL da Postagem" \
--width=400 --center > $tempImg
Esse é o diálogo exibido:

Com isso, todas as informações são transferidas para o arquivo temporário, que está na variável $tempImg. Como esse arquivo tem uma linha em branco, é usado o comando sed -i '/^$/d' $tempImg para removê-las.
## Retirando Linhas Vazias do Arquivo
sed -i '/^$/d' $tempImg
## Definindo Variáveis
urlImage="$(head -n 1 $tempImg)"
urlPost="$(tail -n 1 $tempImg)"
E como são duas variáveis no arquivo, são usados os comandos head e tail para guardar, respectivamente, a primeira linha na variável urlImage e a última na urlPost.
Tratando a URL por Site
Cada Site tem uma maneira diferente de tratar como essas URLs funcionam. Mas uma coisa é certa: Dá pra extrair, ao menos, o ID e o Autor daquela imagem. Com isso, decidi suportar apenas cinco sites: Twitter/X, Bluesky, Pinterest, FurAffinity e DeviantART.
Twitter/X
Começando pelo Twitter, que foi uma das razões para eu ter feito esse Script. Como exemplo, está sendo usado essas URLs:
https://pbs.twimg.com/media/GjeGdV4W0AAyFcV?format=jpg&name=large
https://x.com/CantinhoDoRomeo/status/1890050798228267254/photo/1
Tudo começa com o if, onde é detectado que o Twitter é quem será tratado. Basicamente, é usado o echo para exibir a URL da Postagem, e é verificado se tem algum x.com naquela URL.
if ! [[ -z `echo $urlPost | grep "x.com"` ]]; then
Depois, é a hora de tratar o nome do Autor. Com isso, vem o comando cut1, que será usado várias vezes ao decorrer desse Script.
author="$(echo $urlPost | cut -d '/' -f4)"
O que ocorre nesse comando?
echo $urlPost: Primeiro ele exibe a URL completa, ou seja ohttps://x.com/CantinhoDoRomeo/status/1890050798228267254/photo/1;cut -d '/' -f4: Por fim, extrai o quarto campo. Ou seja, oCantinhoDoRomeo.
E isso é guardado na variável $author. Já temos uma das variáveis. Faltam duas. Para o $idImage, temos duas opções para o Twitter/X que temos que tratar. Uma delas, é o link da postagem no navegador, onde temos no final /photo/1 e um outra usando o botão de compartilhar, que tem o final ?s=20.
if [[ -z `echo $urlPost | grep "photo"` ]]; then
idImage="$(echo $urlPost | cut -d '/' -f6 | cut -d"?" -f1)"
else
idImage="$(echo $urlPost | cut -d '/' -f6)"
fi
O que ocorre com esse comando?
- Primeiramente, verifica se não há um
photono comando. Se a condição for atendida:echo $urlPost: Exibe a URL completa, ou seja ohttps://x.com/CantinhoDoRomeo/status/1890050798228267254?s=20;cut -d '/' -f6: Extrai o sexto campo da URL, que seria o1890050798228267254?s=20cut -d"?" -f1: Corta o que há antes do?. Ou seja, a variável fica1890050798228267254. E isso é guardado na variável$idImage.
- Se a condição não for atendida:
echo $urlPost: Exibe a URL completa, ou seja ohttps://x.com/CantinhoDoRomeo/status/1890050798228267254/photo/1;cut -d '/' -f6: Extrai o sexto campo da URL, que seria o1890050798228267254.
Com isso, a URL https://x.com/CantinhoDoRomeo/status/1890050798228267254/photo/1 se torna 1890050798228267254. Esse é o $idImage.
Porém, ainda precisamos ter o formato da imagem, para que a imagem seja salva corretamente. Ao contrário do $idImage e do $author, para a extensão do arquivo, precisamos da URL da Imagem, pois a extensão da imagem está lá. E esse é o trecho necessário pra isso:
fileExt="$(echo $urlImage | cut -d '/' -f5 | cut -d '&' -f1 | cut -d '=' -f2)"
E o que esse comando faz? Vamos ao passo a passo:
echo $urlImage: Apenas exibe a URL. Ou seja, a URL ainda éhttps://pbs.twimg.com/media/GjeGdV4W0AAyFcV?format=jpg&name=large;cut -d '/' -f5: Extrai o quinto campo da URL, usando o/como separador. Ou seja, é extraída a parteGjeGdV4W0AAyFcV?format=jpg&name=largeda URL;cut -d '&' -f1: Usando o&como delimitador, retira a parte final da URL, assim ficandoGjeGdV4W0AAyFcV?format=jpg;cut -d '=' -f2: por fim, é extraída a parte final do que restou, ou seja ojpg.
Assim, temos todas as peças para formar o nome do arquivo. Agora, é só juntar tudo em uma última variável:
filename="$author-Twitter-$idImage.$fileExt"
Assim, o nome do arquivo fica como CantinhoDoRomeo-Twitter-1890050798228267254.jpg.
Bluesky
Okay, o Bluesky não é uma Rede Social que eu gosto muito de usar, mas mesmo assim decidi dar suporte, pois tem alguns artistas que só estão por lá. Sendo assim, essas são as URLs de exemplo.
https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:vkqbj2ogt6lap6hqire2gxo3/bafkreidedpz37pyj42kz4qeetoa37e3pnwomfkmoilulk5esy3yrsuj6xy@jpeg
https://bsky.app/profile/cantinhodoromeo.com.br/post/3l6t5m7bfrs2m
Como no caso do Twitter/X, é verificado se tem a URL do Bluesky, no caso, o bsky.app. É utilizando um elif, pois a cadeia de if já foi iniciada com o Twitter/X.
elif ! [[ -z `echo $urlPost | grep "bsky.app"` ]];then
Para o Autor do Post, o Bluesky utiliza um esquema um pouco diferente. Ele utiliza nomes de domínio. Mas nessa primeira versão, procurei extrair apenas o nome do usuário sem o domínio, e assim vem esse comando:
author="$(echo $urlPost | cut -d '/' -f5 | cut -d '.' -f1)"
E o que esse comando faz?
echo $urlPost: Exibe a URL completa, ou seja ohttps://bsky.app/profile/cantinhodoromeo.com.br/post/3l6t5m7bfrs2m;cut -d '/' -f5: O quinto campo da URL é extraído usando o/como separador, ficando assimcantinhodoromeo.com.br;cut -d '.' -f1: É extraído o primeiro campo, usando o.como separador. Ficando assim:cantinhodoromeo.
Assim, temos a variável $author. Ainda faltam duas. Para a variável $idImage é tudo bem simples, pois tem uma única forma de fazer as coisas, e é com esse comando que isso é feito:
idImage="$(echo $urlPost | cut -d '/' -f7)"
E o que esse comando faz?
echo $urlPost: Exibe a URL completa, ou seja ohttps://bsky.app/profile/cantinhodoromeo.com.br/post/3l6t5m7bfrs2m;cut -d '/' -f5: O sétimo campo da URL é extraído usando o/como separador, ficando assim3l6t5m7bfrs2m.
Com isso, temos a variável $idImage. Por agora, falta a extensão do arquivo. Para obter a extensão, é utilizado a URL da Imagem, ao invés do URL da Postagem, e a extração da extensão é feita com esse comando:
fileExt="$(echo $urlImage | cut -d '@' -f2)"
E isso é bem simples:
echo $urlImageexibe a URL completa, que nesse caso é ahttps://cdn.bsky.app/img/feed_fullsize/plain/did:plc:vkqbj2ogt6lap6hqire2gxo3/bafkreidedpz37pyj42kz4qeetoa37e3pnwomfkmoilulk5esy3yrsuj6xy@jpeg;cut -d '@' -f2: Extrai a URL, que está no segundo campo usando o@como delimitador.
Com isso, temos o Autor da Postagem, o ID e a extensão do arquivo. Assim é só juntar tudo numa única variável.
filename="$author-bsky-$idImage.$fileExt"
Assim, o nome do arquivo fica cantinhodoromeo-bsky-3l6t5m7bfrs2m.jpeg.
O Pinterest é um dos sites mais simples para salvar os arquivos, e de vez em quando uso ele para salvar algumas referências. Essas são as URLs de exemplo:
https://i.pinimg.com/736x/22/b5/72/22b572985dba27b9e0600ab9bd0e81fd.jpg
https://br.pinterest.com/pin/356136283051872115/
Assim como nos anteriores, tudo começa com a detecção do pinterest na URL que foi repassada para o Script.
elif ! [[ -z `echo $urlPost | grep "pinterest"` ]];then
Como no Pinterest, não há exatamente um autor da imagem e não há uma forma para extrair essa variável, então é extraído apenas o ID da Imagem, com esse comando:
idImage="$(echo $urlPost | cut -d '/' -f5)"
E o que ele faz?
echo $urlPost: Exibe a URL da Postagem, ou sejahttps://br.pinterest.com/pin/356136283051872115/;cut -d '/' -f5: Extrai o quinto campo da URL, usando o/como delimitador. Ou seja, o356136283051872115.
Como não há o autor da imagem no Pinterest, só falta extrair a extensão da imagem. Para isso, é usada a URL da Imagem, e é usado esse comando:
fileExt="$(echo $urlImage | cut -d '/' -f8 | cut -d '.' -f2)"
E o que ele faz?
echo $urlImage: Exibe a URL completa, ou seja,https://i.pinimg.com/736x/22/b5/72/22b572985dba27b9e0600ab9bd0e81fd.jpg;cut -d '/' -f8: Extrai o oitavo campo da URL usando o/como delimitador, assim ficando o22b572985dba27b9e0600ab9bd0e81fd.jpg;cut -d '.' -f2: Por fim, extrai a extensão do arquivo, usando o.como delimitador. Ou seja, é extraído ojpg.
Com o ID e a Extensão, agora podemos juntar as partes com esse comando:
filename="pinterest-$idImage.$fileExt"
Assim, o nome do arquivo fica pinterest-356136283051872115.jpg.
FurAffinity
O FurAffinity é outro site que volta e meia eu salvo algumas coisas dele. E essas são as URLs de exemplo:
https://d.furaffinity.net/art/coelhoposa/1735863892/1735863892.coelhoposa_2025_01_-_primeiro_desenho_de_2025.jpg
https://www.furaffinity.net/view/59387664
Assim como nos anteriores, tudo começa com a detecção do furaffinity na URL que foi repassada para o Script.
elif ! [[ -z `echo $urlPost | grep "furaffinity"` ]];then
E uma coisa curiosa é que, ao contrário dos anteriores, o nome do Autor da imagem está na URL da Imagem, não da postagem. Sendo assim, foi usado esse comando para extrair o Autor:
author="$(echo $urlImage | cut -d '/' -f5)"
E o que esse comando faz?
echo $urlImage: Exibe toda a URL, ou seja ohttps://d.furaffinity.net/art/coelhoposa/1735863892/1735863892.coelhoposa_2025_01_-_primeiro_desenho_de_2025.jpgcut -d '/' -f5: Extrai o quinto campo da URL usando o/como delimitador, ou seja ocoelhoposa.
Assim, temos a variável $author. E faltam mais duas variáveis. Agora, para o ID da Imagem, usaremos a URL do Post.
idImage="$(echo $urlPost | cut -d '/' -f5)"
Assim como na variável anterior, mas usando a URL do Post no FurAffinity:
echo $urlImage: Exibe toda a URL, ou seja ohttps://www.furaffinity.net/view/59387664;cut -d '/' -f5: Extrai o quinto campo da URL usando o/como delimitador, ou seja o59387664.
Assim, temos a segunda variável, que é a $idImage. Ainda falta a extensão do Arquivo que, assim como a $author, é obtida usando a URL da Imagem. E é feita com esse comando:
fileExt="$(echo $urlImage | cut -d '/' -f7 | cut -d '.' -f3)"
E como esse comando funciona?
echo $urlImage: Exibe toda a URL, ou seja ohttps://d.furaffinity.net/art/coelhoposa/1735863892/1735863892.coelhoposa_2025_01_-_primeiro_desenho_de_2025.jpg;cut -d '/' -f7: Extrai o sétimo campo da URL usando o/como delimitador, ou seja o1735863892.coelhoposa_2025_01_-_primeiro_desenho_de_2025.jpg;cut -d '.' -f3: Extrai o terceiro campo do que restou da URL usando o.como delimitador, assim restando apenas ojpg.
Sendo assim, resta juntar as três variáveis numa única, com esse comando:
filename="$author-FurAffinity-$idImage.$fileExt"
E assim, o nome do Arquivo fica coelhoposa-FurAffinity-59387664.jpg.
DeviantART
Por fim, o DeviantART. Apesar de estar apinhado de imagens geradas por Inteligência Artificial, ainda é um site útil para encontrar referências. As URLs de exemplo, são essas aqui:
https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/fb33f6af-ec27-4a6f-a37a-0712001e06f5/div8i9f-8f63c1c5-157f-4be1-b480-525c72e479eb.jpg/v1/fill/w_894,h_894,q_70,strp/2024_159___mocha_sendo_bem_fofinho_by_coelhoposa_div8i9f-pre.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MjAwMCIsInBhdGgiOiIvZi9mYjMzZjZhZi1lYzI3LTRhNmYtYTM3YS0wNzEyMDAxZTA2ZjUvZGl2OGk5Zi04ZjYzYzFjNS0xNTdmLTRiZTEtYjQ4MC01MjVjNzJlNDc5ZWIuanBnIiwid2lkdGgiOiI8PTIwMDAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.fIHRG5I7QdhW9d-K7Tz3iOqTWFDGuaOOqiCkCMGTmDY
https://www.deviantart.com/coelhoposa/art/2024-159-Mocha-sendo-bem-fofinho-1140856179
Assim como nos anteriores, tudo começa com a detecção do deviantart na URL que foi repassada para o Script.
elif ! [[ -z `echo $urlPost | grep "deviantart"` ]];then
E assim, vamos para a extração das variáveis. Começando pela $author, que é extraída usando a URL da Postagem. É utilizado esse comando pra isso:
author="$(echo $urlPost | cut -d '/' -f4)"
Como esse comando funciona?
echo $urlPost: Primeiramente exibe toda a URL, ou sejahttps://www.deviantart.com/coelhoposa/art/2024-159-Mocha-sendo-bem-fofinho-1140856179;cut -d '/' -f4: Extrai o quarto campo da URL usando o/como delimitador. Ou seja, ocoelhoposa.
Assim, temos a variável de $author. Ainda faltam duas. Já para o ID da Imagem, também é usada a URL do Post, só que com outro campo, o que resulta nesse comando:
idImage="$(echo $urlPost | cut -d '/' -f6)"
Como esse comando funciona?
echo $urlPost: Primeiramente exibe toda a URL, ou sejahttps://www.deviantart.com/coelhoposa/art/2024-159-Mocha-sendo-bem-fofinho-1140856179;cut -d '/' -f6: Extrai o sexto campo da URL usando o/como delimitador. Ou seja, o2024-159-Mocha-sendo-bem-fofinho-1140856179.
Agora, falta apenas a extensão da imagem. Aqui é onde o filho chora e a mãe não vê, pois trataremos aquela URL enorme, que é a URL da Imagem.
fileExt="$(echo $urlImage | cut -d '/' -f10 | cut -d '.' -f2 | cut -d '?' -f1)"
Como esse comando funciona:
echo $urlImage: Exibe toda a URL, ou seja:
https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/fb33f6af-ec27-4a6f-a37a-0712001e06f5/div8i9f-8f63c1c5-157f-4be1-b480-525c72e479eb.jpg/v1/fill/w_894,h_894,q_70,strp/2024_159___mocha_sendo_bem_fofinho_by_coelhoposa_div8i9f-pre.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MjAwMCIsInBhdGgiOiIvZi9mYjMzZjZhZi1lYzI3LTRhNmYtYTM3YS0wNzEyMDAxZTA2ZjUvZGl2OGk5Zi04ZjYzYzFjNS0xNTdmLTRiZTEtYjQ4MC01MjVjNzJlNDc5ZWIuanBnIiwid2lkdGgiOiI8PTIwMDAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.fIHRG5I7QdhW9d-K7Tz3iOqTWFDGuaOOqiCkCMGTmDY
cut -d '/' -f10: Extrai o décimo campo da URL usando o/como delimitador. Ou seja:
2024_159___mocha_sendo_bem_fofinho_by_coelhoposa_div8i9f-pre.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MjAwMCIsInBhdGgiOiIvZi9mYjMzZjZhZi1lYzI3LTRhNmYtYTM3YS0wNzEyMDAxZTA2ZjUvZGl2OGk5Zi04ZjYzYzFjNS0xNTdmLTRiZTEtYjQ4MC01MjVjNzJlNDc5ZWIuanBnIiwid2lkdGgiOiI8PTIwMDAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.fIHRG5I7QdhW9d-K7Tz3iOqTWFDGuaOOqiCkCMGTmDY
cut -d '.' -f2: Extrai o segundo campo usando o.como delimitador. Ou seja, ojpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.cut -d '?' -f1: Por fim, extrai o primeiro campo, usando o?como delimitador. Ou seja, ojpg.
E como já temos o Autor, o ID da Imagem e a Extensão do Arquivo, juntaremos tudo numa única variável.
filename="$author-deviantArt_$idImage.$fileExt"
E o nome do Arquivo fica assim: coelhoposa-deviantArt_2024-159-Mocha-sendo-bem-fofinho-1140856179.jpg.
Baixando o arquivo
Bom, já temos tanto o nome do arquivo, como a URL para baixar ele. Sendo assim é executada uma verificação para ver se as duas variáveis estão vazias. E caso não estejam, o Download é feito usando o curl.
if ! [[ -z "$filename" && -z "$urlImage" ]]; then
echo -e "\n## Baixando $filename..."
curl -o $idFolder/$filename $urlImage
fi
Depois que o Download é feito, o Script aguarda três segundos e chama outra função.
sleep 3
continue
E assim, fecha a função principal, que é a que baixa os arquivos.
Outro diálogo de confirmação
Talvez, poderia ter uma forma melhor de fazer isso, do Script continuar em Looping até que eu quisesse encerrar ele. Optei por fazer uma outra função que chama um diálogo para confirmar se quero ou não continuar a baixar outras imagens. E é algo bem simples:
continue () {
yad --center -title="Image Downloader" \
--image="dialog-question" \
--text="Deseja Continuar?" \
--button="Sim:0" \
--button="Não:1"
ret=$?
if [[ $ret -eq 0 ]]; then
downloadImage
elif [[ $ret -eq 1 ]]; then
exit
else
echo "O Image Downloader foi fechado."
fi
}
Essa função começa exibindo um diálogo que pergunta se quero continuar ou não.

E isso é feito pelo comando do yad.
yad --center -title="Image Downloader" \
--image="dialog-question" \
--text="Deseja Continuar?" \
--button="Sim:0" \
--button="Não:1"
Depois, captura a resposta do Diálogo com o ret=$? e joga numa cadeia de if.
if [[ $ret -eq 0 ]]; then
downloadImage
elif [[ $ret -eq 1 ]]; then
exit
else
echo "O Image Downloader foi fechado."
fi
Basicamente, se for igual a 0, ele chama novamente a função que baixa os arquivos. Se for igual a 1 ou a qualquer outro número, o Script se encerra.
Resultado desse Script
Eu utilizei as imagens de exemplo para poder demonstrar como esse Script funciona, e aqui estão elas na pasta que o Script usa para baixar as imagens.

E aqui é ele funcionando em vídeo:
Palavras Finais
Esse é um Script interessante que gostei de fazer. Já falei isso antes, mas adoro como eu consigo automatizar essas pequenas coisas no Linux. O Bash é realmente uma linguagem bem interessante e bem poderosa, e o que você consegue fazer, depende apenas do seu conhecimento dos comandos que podem ser usados.
Eu nunca vi ninguém fazendo isso, então decidi fazer eu mesmo. Talvez, eu possa expandir esse script para abrigar mais sites? Ou mesmo, deixar que ele possa ser expandido por arquivos externos, afinal temos o comando source que consegue carregar outros arquivos e as suas funções? É algo a se pensar e que gosto muito disso.
E talvez, eu possa colocar esse Script simples no Github, para que outras pessoas possam usar ele. Eu acho uma boa ideia, afinal, outras pessoas podem precisar organizar as imagens baixadas de alguma forma.
-
O comando
cuté composto por dois argumentos: o-d, é o delimitador, ou seja, o caractere que está separando o que está sendo cortado, já o-fé o campo que será extraído. ↩︎