Extraia o nome do arquivo base de uma URL usando o bash

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

Eu esperava que esse código file.extfosse impresso , mas ele imprime o URL inteiro. Por quê? Como posso extrair o nome do arquivo?

ManuelSchneid3r
fonte
Ok, obv, estou esperando que as coisas erradas aconteçam. Bem, eu quero extrair file.ext
ManuelSchneid3r
Você está tentando cortar o fio da corda? Tente dirname $url. Or grep -o 'http://[^/]*' <<<$url.
11113 Kevin

Respostas:

27

Porque a palavra precisa corresponder à string a ser aparada. Deve parecer com:

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

Graças derobert, você me guiou na direção certa.

ManuelSchneid3r
fonte
Hah, nós dois percebemos isso ao mesmo tempo. Feliz por ajudar.
11263 derobert
10

Para citar a 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, […]

/*não corresponde ao início, porque seu URL começa com hnão /.

Uma maneira trivial de fazer o que você está procurando (de acordo com o seu comentário) é echo "$url" | rev | cut -d / -f 1 | rev. Mas é claro, isso dará resultados interessantes para URLs que terminam em uma barra.

Outra maneira de fazer o que você quer pode ser usar o padrão */.

derobert
fonte
Que bom que você deu uma explicação do que precisa ser feito e a citação da página de manual é uma enorme vantagem! Isso me ajudou muito! Obrigado novamente! :)
Fadi
5

basename(1) também funciona com URLs, então você pode simplesmente fazer:

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

Veja também: Bash Extended Globbing , embora neste caso o globo estendido não seja essencial.

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

Resultado: file.ext

Peter.O
fonte