Extraiga el nombre del archivo base de una URL usando bash


14
url=http://www.foo.bar/file.ext; echo ${url##/*}

Esperaba que este código se imprimiera file.ext, pero imprime la URL completa. ¿Por qué? ¿Cómo puedo extraer el nombre del archivo?


Bien, obviamente espero que sucedan cosas incorrectas. Bueno, quiero extraer file.ext
ManuelSchneid3r

¿Estás tratando de cortar el extremo de la cuerda? Tratar dirname $url. O grep -o 'http://[^/]*' <<<$url.
Kevin

Respuestas:


27

Porque la palabra tiene que coincidir con la cadena que se va a recortar. Debería verse así:

url="http://www.foo.bar/file.ext"; echo "${url##*/}"

Gracias Derobert, me guiaste en la dirección correcta.


Ja, ambos nos damos cuenta al mismo tiempo. Me alegra ser de ayuda.
derobert

10

Para citar la página de manual:

${parameter##word}
   Remove matching prefix pattern.  The word is expanded to produce
   a pattern just as in pathname expansion.  If the pattern matches
   the  beginning of the value of parameter, […]

/*no coincide con el comienzo, porque su URL comienza con hno /.

Una forma trivial de hacer lo que estás buscando (según tu comentario) es echo "$url" | rev | cut -d / -f 1 | rev. Pero, por supuesto, eso dará resultados interesantes para las URL que terminan en una barra inclinada.

Otra forma de hacer lo que quieras podría ser usar el patrón en su */lugar.


¡Me alegra que hayas explicado lo que hay que hacer y que la cita de la página de manual es una gran ventaja! ¡Eso me ayudó mucho! ¡Gracias de nuevo! :)
Fadi

5

basename(1) también funciona con URL, por lo que simplemente podría hacer:

url=http://www.foo.bar/file.ext; basename $url

4

Ver también: Bash Extended Globbing , aunque en este caso el glob extendido no es esencial.

 shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}

Salida: file.ext

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.