BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

Extraer cadena de caracteres con ID de una URL en Bash

BocaDePez

Hola, buenos días.

Los archivos compartidos del disco duro virtual Google Drive suelen mostrarse en distintas URL's:

drive.google.com/file/d/0B7B4KuMmW_NLT0x…?usp=sharing

drive.google.com/file/d/0B7B4KuMmW_NLT0xCekRyXzdMM3M

drive.google.com/uc?export=download&id=0…CekRyXzdMM3M

drive.google.com/open?id=0B7B4KuMmW_NLT0…CekRyXzdMM3M

El ID del archivo anterior es siempre la cadena de caracteres "0B7B4KuMmW_NLT0xCekRyXzdMM3M". Esta cadena en cuestión tiene una longitud de 28 caracteres pero puede variar (en la actualidad está en unos 33 caracteres)

En las dos primeras URL's mostradas es posible aislar el ID mediante:

echo https://drive.google.com/file/d/0B7B4KuMmW_NLT0xCekRyXzdMM3M/view?usp=sharing | cut -d"/" -f6

pero las otras dos.

En las dos segundas URL's mostradas es posible aislar el ID mediante:

ID=$(echo https://drive.google.com/open?id=0B7B4KuMmW_NLT0xCekRyXzdMM3M | rev) ; echo ${ID:0:28} | rev

pero esto solamente serviría para una longitud de 28 caracteres.

¿Existe alguna manera de detectar esas cadenas aleatorias y aislarlas en un scrip programado en bash?

Muchas gracias.

BocaDePez

Sinceramente no sé por qué os empeñáis en hacer tales virguerías en bash. Te recomiendo que uses un lenguaje más apropiado como Perl o Python.

vukits

como tú bien has dicho, los ficheros tienen un identificador único.

y también has puesto cómo descargar absolutamente todo.

https://drive.google.com/file/d/id_fichero

sabiéndo eso, ¿seguro que necesitas más?

mceds
$ sed 's_.*\(ESTOMEINTERESA\).*_\1_'<<<"basurabasurabasurabasuraESTOMEINTERESAbasurabasura"
ESTOMEINTERESA
BocaDePez

Gracias por sus respuestas pero el objetivo es usar un bash script que automatice el proceso de descarga con diferentes ID's, no con una sola (perdón si no me expliqué bien). Ya tengo uno pero solamente acepta los enlaces tipo:

https : // drive.google.com/file/d/0B7B4KuMmW_NLT0xCekRyXzdMM3M/view?usp=sharing
o
https://drive.google.com/file/d/0B7B4KuMmW_NLT0xCekRyXzdMM3M

Este es mi scrip:

#!/bin/bash

for FILE1 in $@

do

if [ -f $FILE1 ]; then

for FILE2 in $(cat $FILE1)

do

ggID=$(echo $FILE2 | cut -d"/" -f6)

ggURL='https://drive.google.com/uc?export=download'

filename="$(curl -sc /tmp/gcokie_${ggID}.txt "${ggURL}&id=${ggID}" | grep -o '="uc-name.*</span>' | sed 's/.*">//;s/<.a> .*//')"

wget --save-cookies /tmp/cookies_${ggID}.txt --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${ggID}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p'

getcode="$(awk '/_warning_/ {print $NF}' /tmp/cookies_${ggID}.txt)"

  wget --load-cookies /tmp/cookies_${ggID}.txt -c "https://docs.google.com/uc?export=download&confirm=${getcode}&id=${ggID}" -O "${filename}"

done

else

ggID=$(echo $FILE1 | cut -d"/" -f6)

ggURL='https://drive.google.com/uc?export=download'

filename="$(curl -sc /tmp/gcokie_${ggID}.txt "${ggURL}&id=${ggID}" | grep -o '="uc-name.*</span>' | sed 's/.*">//;s/<.a> .*//')"

wget --save-cookies /tmp/cookies_${ggID}.txt --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${ggID}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p'

getcode="$(awk '/_warning_/ {print $NF}' /tmp/cookies_${ggID}.txt)"

  wget --load-cookies /tmp/cookies_${ggID}.txt -c "https://docs.google.com/uc?export=download&confirm=${getcode}&id=${ggID}" -O "${filename}"

fi

done

Un saludo.

🗨️ 9
mceds

A ver si acierto, porque aún no lo comprendo.

¿Lo que quieres es un script que detecte cuál es el contenido común a varias cadenas? Por ejemplo, dadas éstas:

jKNf4MWnPORROMPOMPERO7fn08Ot9jaFe2SU9N2gd93hMih1Ma8DuaGQuUN
K+/OS7vTB54i0xl+xj0hXd90MW9440TPORROMPOMPEROoYdIx+2uXCKdINA
/Scd04iQjCocD4CcWBGmeaorBjhLjfJJahBGR46BL/szuPORROMPOMPEROu
oPORROMPOMPERO8AwsDRkZ4faw2HYY8pvIIKm8vMOWUYk5jbL0SpBWFzVx3

... devolviera "PORROMPOMPERO".

🗨️ 8
BocaDePez

Lo que quiere es sacar el id de la url. Como los vídeos de YouTube que tienen un id, pues lo mismo con Drive.

🗨️ 7
mceds

Pero, en tal caso, ya casi se ha respondido él solo: le basta con seguir usando CUT en los otros dos casos.

$ echo "https://drive.google.com/uc?export=download&id=0B7B4KuMmW_NLT0xCekRyXzdMM3M" | cut -d'=' -f3
0B7B4KuMmW_NLT0xCekRyXzdMM3M
 $ echo "https://drive.google.com/open?id=0B7B4KuMmW_NLT0xCekRyXzdMM3M" | cut -d'=' -f2
0B7B4KuMmW_NLT0xCekRyXzdMM3M

También se puede hacer con SED, claro.

🗨️ 6
BocaDePez
BocaDePez
🗨️ 5
mceds
mceds
🗨️ 3
vukits
vukits
🗨️ 2
BocaDePez
BocaDePez
1
🗨️ 1
vukits
vukits
BocaDePez
BocaDePez
vukits

sacado de aqui, y de aqui

tendrás que programarlo mejor...

pero si la longitud de id de google drive es 28, pues este es un ejemplo que funciona. (redefine IFS, separa la url en diferenes pedazos, y coge el que es de longitud 28)

IFS='/' ;for i in `echo "https://drive.google.com/file/d/0B7B4KuMmW_NLT0xCekRyXzdMM3M/view?usp=sharing"`; do echo $i; done | grep -o -w '\w\{28,28\}'
BocaDePez

Gracias a todos por las respuestas.

El problema radica tanto en las distintas posiciones que puede estar situado el ID en la URL y su cambiante número de caracteres. Aquí un ejemplo de URL con 33 caracteres de ID:

https://drive.google.com/file/d/1He7OcWw12dM2Akxfkc_8ELufN2PmYSFM

Sin embargo creo que he conseguido una solución aislando el ID mediante el análisis del código fuente de la referida URL usando para ello los comandos wget, grep y cut:

$ wget -O -https://drive.google.com/file/d/1He7OcWw12dM2Akxfkc_8ELufN2PmYSFM | grep one-google-bar | cut -d"/" -f10

Con el método anterior ya no importa la sintaxis de la URL ni cuál es la longitud del ID.

Sin embargo, a mí me sonaba que existía algún comando o línea de comandos que permitía "adivinar" cadenas de caracteres aleatorios:

gnu.org/software/grep/manual/html_node/C…essions.html

Un saludo a todos.

🗨️ 1
BocaDePez

Perdón, es así:

$ wget -O - https://drive.google.com/file/d/1He7OcWw12dM2Akxfkc_8ELufN2PmYSFM | grep one-google-bar | cut -d"/" -f10
BocaDePez
1

Podrías hacer una expresión regular que te retornara la cadena de carácteres más larga que se corresponda con las características de un ID, es decir:

  • Contiene números
  • Contiene letras en mayúscula y minúscula
  • Contiene guiones bajos
  • Ausencia de paréntesis, interrogantes, símbolos de igualdad, puntos y comas.
🗨️ 1
mceds

Buena idea.