Extraire le nom du fichier de base d'une URL à l'aide de bash

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

Je m'attendais à ce que ce code s'imprime file.ext, mais il imprime l'URL entière. Pourquoi? Comment extraire le nom du fichier?

ManuelSchneid3r
la source
D'accord, je m'attends à ce que les mauvaises choses se produisent. Eh bien, je veux extraire file.ext
ManuelSchneid3r
Vous essayez de couper la fin de la chaîne? Essayez dirname $url. Ou grep -o 'http://[^/]*' <<<$url.
Kevin

Réponses:

27

Parce que le mot doit correspondre à la chaîne à couper. Cela devrait ressembler à:

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

Merci derobert, vous m'avez dirigé dans la bonne direction.

ManuelSchneid3r
la source
Hah, nous le réalisons tous les deux en même temps. Heureux d'avoir pu aider.
derobert
10

Pour citer la page de manuel:

${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, […]

/*ne correspond pas au début, car votre URL commence par hnon /.

Une façon triviale de faire ce que vous cherchez (selon votre commentaire) est echo "$url" | rev | cut -d / -f 1 | rev. Mais bien sûr, cela donnera des résultats intéressants pour les URL se terminant par une barre oblique.

Une autre façon de faire ce que vous voulez peut être d'utiliser le modèle à la */place.

derobert
la source
Heureux que vous ayez expliqué ce qui doit être fait et la citation de la page de manuel est un énorme avantage! Cela m'a beaucoup aidé! Merci encore! :)
Fadi
5

basename(1) fonctionne également avec les URL, vous pouvez donc simplement faire:

url=http://www.foo.bar/file.ext; basename $url
Frank Zdarsky
la source
4

Voir aussi: Bash Extended Globbing , bien que dans ce cas le glob étendu ne soit pas essentiel.

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

Production: file.ext

Peter.O
la source