2011-12-20 17 views
13

Estoy escribiendo un guión de bash y que necesita para obtener el nombre del archivo descargado usando wget y poner el nombre en $ cadenawget: nombre del archivo descargado

por ejemplo, si la descarga de este archivo abajo, quiere poner su nombre a mxKL17DdgUhcr.jpg $ string

wget http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg 
45439 (44K) [image/jpeg] 
Saving to: «mxKL17DdgUhcr.jpg» 

100%[===================================================================================================>] 45 439  --.-K/s в 0s 

2011-12-20 12:25:33 (388 MB/s) - «mxKL17DdgUhcr.jpg» saved [45439/45439] 

Respuesta

26

Utilice el comando basename para extraer el nombre de archivo de la url. Por ejemplo:

url=http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg 
filename=$(basename "$url") 
wget "$url" 
+0

funcionó de maravilla. ¡Muchas gracias! –

+2

Advertencia: Esto no funcionará para las URL que contienen redirecciones o contenido dinámico. Consulte la respuesta de est para la solución correcta. –

11

puede basta con especificar el nombre del archivo antes de descargar, con la opción de -Owget:

wget -O myfile.html http://www.example.com/ 
2

Usted puede ser explícito sobre el nombre de la siguiente manera:

url='http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg' 
file=`basename "$url"` 
wget "$url" -O "$file" 
0

supongo que ya tiene la dirección URL completa del archivo en algún lugar de una variable? Utilice la expansión de parámetros bash para despojar el prefijo:

echo ${url##*/} 
1
~ $ URL='http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg' 
~ $ echo ${URL##*/} 
mxKL17DdgUhcr.jpg 
~ $ wget $URL -O ${URL##*/} 
--18:34:26-- http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg 
      => `mxKL17DdgUhcr.jpg' 
-2

Así que usted quiere dar el nombre del archivo/imagen como parámetro

probar esto

echo -n "Give me the name of file in http://pics.sitename.com/images/191211/ :" 

read $string 

sudo wget http://pics.sitename.com/images/191211/$string ;; 

creo que esto podría ayudarle

27
wget --server-response -q -O - "https://very.long/url/here" 2>&1 | 
    grep "Content-Disposition:" | tail -1 | 
    awk 'match($0, /filename=(.+)/, f){ print f[1] }') 

Esta es la versión correcta ya que puede haber varios redireccionamientos 301/302 y finalmente un encabezado Content-Disposition: para establecer el nombre de archivo

Adivinar el nombre de archivo basado en la URL no siempre es correcto.

+2

Me gusta este enfoque, pero desafortunadamente el awk en los derivados de Debian (Ubuntu, por ejemplo) no admite el tercer argumento en 'match'. – jtravaglini

+0

aunque no siempre es perfectamente preciso, este es el enfoque correcto. – diedthreetimes

+1

En Ubuntu, puede usar: 'wget --server-response -q -O -" https: //very.long/url/here "2> & 1 | grep "Content-Disposition:" | cola -1 | awk -F "filename =" '{print $ 2}' ' –

2

Para manejar nombres de archivos codificados en URL:

URL="http://www.example.com/ESTAD%C3%8DSTICA(2012).pdf" 
BASE=$(basename ${URL})    # ESTAD%C3%8DSTICA(2012).pdf 
FILE=$(printf '%b' ${BASE//%/\\x}) # ESTADÍSTICA(2012).pdf 
wget ${URL} 
Cuestiones relacionadas