Escriba la salida de wget o curl en un nombre de archivo personalizado basado en la url

12

Por ejemplo tengo un enlace http://www.abc.com/123/def/ghi/jkl.mno. Quiero descargarlo usando wgeto curly obtener el nombre del archivo de salida como def_ghi_jkl.mno, donde def_ghise toma la parte del enlace.

Pondré este wgetcomando en un script para descargar varios archivos para que no pueda dar explícitamente el nombre del archivo de salida.

gvz
fuente

Respuestas:

15

curltiene la opción -o, --outputque toma un solo argumento que indica que se debe escribir la salida del nombre de archivo en lugar de stdout. Si está utilizando {}o []para rodear elementos en la URL (generalmente se usa para recuperar varios documentos), puede usar #seguido de un número en el especificador de nombre de archivo. Cada una de estas variables se reemplazará con la cadena correspondiente para la URL que se busca. Para buscar varios archivos, agregue una lista de tokens separados por comas dentro de {}. Si partes de las URL que se van a buscar son números secuenciales, puede especificar un rango con [].

Ejemplos:

  curl http://www.abc.com/123/{def}/{ghi}/{jkl}.mno -o '#1_#2_#3.mno'

Tenga en cuenta las comillas alrededor del argumento de la opción (no es necesario a menos que el nombre de archivo comience con una de las variables expandidas). Esto debería dar como resultado el archivo de salida def_ghi_jkl.mno.

  curl http://www.abc.com/123/{def}/{ghi}/{jkl,pqr,stu}.mno -o '#1_#2_#3.mno'

Esto debería dar como resultado los archivos de salida def_ghi_jkl.mno, def_ghi_pqr.mnoy def_ghi_stu.mno.

 curl http://www.abc.com/123/{def}/{ghi}/[1-3].mno -o '#1_#2_#3.mno'

Esto debe resultar en los archivos de salida def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.

Thomas Nyman
fuente
2

wgettiene un interruptor -O(forma larga --output-document) que le permite especificar el nombre del archivo para guardar. (Presumiblemente, curl tiene algo similar). Entonces, podría hacer:

wget -O def_ghi_jkl.mno http://www.abc.com/123/def/ghi/jkl.mno

y hará lo que quieras.

Probablemente podría crear un contenedor alrededor de wget si desea automatizar este esquema de nomenclatura, pero sería bastante difícil obtener una prueba de balas y definitivamente está fuera del alcance de esta respuesta. (El caso simple de un solo archivo descargado desde una URL explícita no debería ser muy difícil de entender, pero ese no es el único modo de operación de wget. Para nombrar solo un caso que hace que esto sea poco trivial, puede especificar varias URL en la línea de comando).

Tenga en cuenta que -Ono es lo mismo -oque escribir la salida del wget en el archivo nombrado.

un CVn
fuente
Es parte de un script, el nombre de archivo explícito como ese no funcionará.
gvz
@ user47567 ¿Por qué no? ¿Qué pasa con el hecho de que se llama wget o curl desde un script hace que esto sea poco práctico? (Y realmente, si tiene tales restricciones sobre qué respuestas funcionarán, esa información realmente debería entrar en la pregunta desde el principio).
un CVn
0

Aquí hay un truco de sustitución de Bash

link="http://www.abc.com/123/def/ghi/jkl.mno"
OutputFile=$( echo ${link:23: 23}| tr "/" "_" )
echo $OutputFile
def_ghi_jkl.mno

{$link:23: 23}eliminará " http://www.abc.com/123/ " y ${parameter:offset:length}luego trlo reemplazará /por _.

Así que ahora puedes usarlo fácilmente con wget o curl

wget $link  -O $OutputFile

También podemos usar awk, esto extraerá los últimos tres archivos de la cadena de entrada:

OutputFile=$( echo $link | awk -F/ 'BEGIN{OFS="_"}{ print $( NF-2),$(NF - 1 ),$NF}' )
Rahul Patil
fuente
0

El nombre de archivo que necesita no puede derivarse por wgetsí mismo, por lo que debe ser manejado por un script de shell:

$ url='http://www.example.com/123/def/ghi/jkl.mno'
$ outFile=$(echo "$url" | cut -d /  -f 5- | tr / _)
$ echo $outFile 
def_ghi_jkl.mno
$ wget "$url" -O "$outFile"

O si te gusta como una línea:

wget "$url" -O "$(echo "$url" | cut -d /  -f 5- | tr / _)"
Volker Siegel
fuente
0

Si prefiere el rizo, la forma más directa es:

curl -L -o <filename> "https://drive.google.com/uc?export=download&id=<file id>"

nombre de archivo: el nombre del archivo descargado

ID del archivo: el ID del archivo en la vista web de Google Drive en el formato https://drive.google.com/file/d/ ID / vista del archivo

Frijol ágil
fuente