1 votos

Descargando archivos de GitHub Archive usando wget: has {} para iteración

Si puedo copiar/pegar esto en la línea de comandos, puedo descargar TODOS los GitHub archivo de los archivos durante 24 horas el 1 de enero de 2015:

wget http://data.gharchive.org/2015-01-01-{0..23}.json.gz

Quiero ser capaz de hacer esto por varios días, utilizando una secuencia de comandos. Por ejemplo, en mi .sh archivo:

#!/bin/bash

while read line
do
    wget $line
  done < download_github_files.txt

Y en download_github_files.txt, tengo:

http://data.gharchive.org/2015-01-01-{0..23}.json.gz
http://data.gharchive.org/2015-01-02-{0..23}.json.gz
http://data.gharchive.org/2015-01-03-{0..23}.json.gz

Por desgracia, cuando ejecuto el .sh archivo, tengo tres copias impresas de:

--2019-02-27 19:00:28--  http://data.gharchive.org/2015-01-01-'%7B'0..23'%7D'.json.gz
Resolving data.gharchive.org (data.gharchive.org)... 
Connecting to data.gharchive.org (data.gharchive.org)...
connected.
HTTP request sent, awaiting response... 404 Not Found
2019-02-27 19:00:28 ERROR 404: Not Found.

El problema es claramente con {. Escapar de ese personaje no ayuda, porque está destinado a ser un iterador de lo que puedo decir.

¿Cómo puedo descargar estos archivos usando wget?

EDITAR:

Hmm. Estoy teniendo el mismo problema, tratando de usar el primero publicado solución:

.sh archivo (claramente yo voy a hacer todos los meses del año, pero me he limitado a febrero para la facilidad de visualización):

#!/bin/bash

for i in {01..12}; do
    if [ ${i} = 02 ]; then
        for j in {01..28}; do
            for k in {0..23}; do
                wget http://data.gharchive.org/2011-${i}-${j}-${k}.json.gz
            done
        done
    fi
done

Mismo problema. Por ejemplo, me sale:

--2019-02-27 20:50:05--  http://data.gharchive.org/2011-02-01-5.json.gz
Resolving data.gharchive.org (data.gharchive.org)... 
Connecting to data.gharchive.org (data.gharchive.org)...
HTTP request sent, awaiting response... 404 Not Found
2019-02-27 20:50:05 ERROR 404: Not Found.

Pero si ejecuto el comando

wget http://data.gharchive.org/2011-02-01-5.json.gz

entonces yo no tengo ningún problema. No puedo descargar el archivo de forma manual, pero no puedo hacerlo en un script de bash. Cualquier otra idea?

0voto

JakeGould Puntos 17382

Simplemente coloque el wget en un bucle de iterador for como este:

 #!/bin/bash

for i in {1..23}; do
  wget http://data.gharchive.org/2015-01-01-${i}.json.gz;
done
 

0voto

Kamil Maciorowski Puntos 897

Llave de expansión que ocurre antes de la expansión de la variable, por lo que los apoyos asignados a $line no expandido.

Esto debería funcionar:

eval wget $line

donde eval evalúa la línea de nuevo. En este punto, $line ya se ha ampliado y la cáscara se evalúa una línea que se parece a su primer comando:

wget http://data.gharchive.org/2015-01-01-{0..23}.json.gz

Pero , ¡cuidado! Una entrada como

foo; rm -rf /some/precious/directory

en la download_github_files.txt archivo de resultado en la siguiente línea que está siendo evaluado:

wget foo; rm -rf /some/precious/directory

"Evaluado" significa ; hace diferentes comandos (aunque sin eval este ; procedentes de $line sería sólo una parte de la foo; argumento pasado a wget).

Ver ¿por Qué debería eval ser evitado en Bash, y lo que debo usar en su lugar? Dudo que este enlace contiene todo lo que usted podría utilizar fácilmente en su lugar eval en este particular caso, todavía se arroja luz sobre algunas cuestiones generales. Uso eval sólo si el archivo contiene las líneas bajo su control total y está seguro de que va a ser evaluada sin sorpresas.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: