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?

user304822
fonte
stackoverflow.com/questions/2664740/…
sancho.s ReinstateMonicaCellio

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.

garyjohn
fonte
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
13

Se você conhece a extensão, pode usar o nome da base

$ basename /home/jsmith/base.wiki .wiki
base
Steven Penny
fonte
0

Uma linha no Bash sem usar o nome de base :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
LuckyDams
fonte