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?


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.


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.


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.