basename: Tirando diretorio e sufixos de uma string e outras coisas

Voltando ao simples e fácil

Muitas vezes a gente faz coisas porque não sabe que existe, isso em vaias linguagens. Atire a primeira pedra que nunca fez os parses para coisas malucas e depois descobriu que tinha algo já feito :p.

Bom, uma situação muito comum, é querer extrair o nome de um diretório de uma path que você tem ou algo que lembre uma situação assim. Por exemplo:

Você tem:

/home/psycho/teste-1000

E quer obter o nome do diretório sem o path para ele, assim:

teste-1000

Ou você tem um arquivo e quer pegar o nome dele sem a extensão, por exemplo, tento isso:

teste-1000/data-0001.txt

e quer obter algo como:

data-0001

Bom, você pode fazer isso de forma fácil! Existe a função chamada “basename” que faz este tipo de parse para você. Ela esta disponível em “C”, shell script e algumas outras linguagens.

Em “C” ela tem a seguinte assinatura:

#include <libgen.h>

char *basename(char *path);

Em shell script, que eu pretendo me ater mais, ela tem a seguinte assinatura:

basename NAME [SUFFIX]

Caso esse SUFFIX seja fornecido, ele também sera tirado da parte final de NAME.

Usos e possibilidades

Bom, para que usamos e como usamos isso?
Vamos supor que você tem um arquivo, e o nome dele diz uma informação util sobre o programa que você esta executando, então, nesse caso usamos o “basename” para pegar essa informação sem ter que fazer um parser do nome do arquivo:

echo "${FILE}"
echo -n "O processo em execução é: "
basename "${FILE}" .tmp
echo -n "Sem tirar o final: "
basename "${FILE}"
echo -n "Tirando uma parte estranha do final: "
basename "${FILE}" mp

saída esperada:

/tmp/data.343454/job-1234.tmp
O processo em execução é: job-1234
Sem tirar o final: job-1234.tmp
Tirando uma parte estranha do final: job-1234.t

Outro exemplo mais legal que eu precisei recentemente.
Eu tinha uma URL de um arquivo e precisava pegar o nome do arquivo pela URL. Se você pensar direitinho, a URL é o mesmo formato do path de um arquivo, então eu fiz:

echo URL: "${URL}"
basename "${URL}"

saída esperada:

URL: http://10.200.13.100/boot/rootfs-020520010.sqfs
rootfs-020520010.sqfs

Voua-la! Rapidamente consegui extrair o que eu queria e sobrou tempo para eu ir ver o filme do Pelé!

PS:. Antes que alguém comente(se tem alguém lendo isso aqui…), no meu caso as URL são bem definidas e da pra saber o arquivo por elas(nada de HEADERS de HTTP para mudar o nome do arquivo).

Alternativas

Bom, o “basename” é bem simples e rápido, mas ainda é necessário chamar um programa de fora para uma simples função, e isso pode remotamente gerar uma demora em uma ação simples.

Mas caso você seja um “taradinho” por performance( como eu, que preciso de um script que rode no servidor web com muitos clientes 😉 ), existe uma forma mais rápida de fazer.

Se o caminho estiver em uma variável, usando manipulação avançada de variáveis você pode fazer assim o meu ultimo exemplo anterior:

echo URL: "${URL}"
echo "${URL//*\/}"

saída esperada:

URL: http://10.200.13.100/boot/rootfs-020520010.sqfs
rootfs-020520010.sqfs

Ohhhh! Como isso foi feito Mr. M? Bom, substituição avançada com bash script, só digo isso. Fica ai a Dica, falar melhor de variáveis avançado em bash é capitulo para outro post, e esse aqui já ta grande demais ;).

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: