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

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

Eu esperava que esse código imprimisse file.ext , mas imprime a URL inteira. Por quê? Como posso extrair o nome do arquivo?

    
por ManuelSchneid3r 11.02.2013 / 15:34

4 respostas

18

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

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

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

    
por 11.02.2013 / 15:49
10

Para citar a página do 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 h não / .

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

Outra maneira de fazer o que você deseja é usar o padrão */ .

    
por 11.02.2013 / 15:41
3

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

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

Saída: file.ext

    
por 11.02.2013 / 15:49
2

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

url=http://www.foo.bar/file.ext; basename $url
    
por 20.02.2018 / 15:34

Tags