Como extrair o nome do arquivo sem a extensão de um caminho completo?


10

Estou tentando corrigir meu primeiro script bash e, a certa altura, um nome de arquivo é passado para o script como $1. Preciso extrair o nome do arquivo sem a extensão.
Atualmente, estou assumindo que todas as extensões são três letras, então removo os últimos 4 caracteres para obter o nome do arquivo:

a="${1:0:-4}"

Mas preciso trabalhar com extensões com mais de três caracteres, como %~n1no Windows.
Existe alguma maneira de extrair o nome do arquivo sem a extensão dos argumentos?


Respostas:


27

A maneira usual de fazer isso no bash é usar a expansão de parâmetros. (Consulte a página de manual do bash e procure por "Expansão de parâmetros".)

a=${1%.*}

A %indica que tudo o que corresponda ao padrão seguinte ( .*) a partir da direita, usando o jogo mais curto possível, deve ser excluída do parâmetro $1. Nesse caso, você não precisa de aspas duplas (") em torno da expressão.


1
Os padrões de arquivo são geralmente assim: "Something.eng.ext". Obviamente, nesse caso, ext é a extensão, mas usar $ {1%. *} Retornará apenas a parte "Something", certo?
user304822

2
No. ${1%.*}retornará Something.eng. Se você deseja retirar tudo da direita, .incluindo o ., use ${1%%.*}, que retornará Something.
garyjohn


0

Uma linha no Bash sem usar o nome de base :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.