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?

ManuelSchneid3r
fuente
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.

ManuelSchneid3r
fuente
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.

derobert
fuente
¡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
Frank Zdarsky
fuente
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

Peter.O
fuente