$ pathname=/home/paulo/paulo.pdf
$ printf '%s\n' $pathname:t:r
paulo
O :tmodificador ("tail") extrai o último componente do nome do caminho $pathname(funciona como basename).
O :rmodificador ("root", suponho) extrai o bit do nome do arquivo até a extensão, se houver. A extensão é a parte do nome do arquivo que ocorre após o último ponto. Isso significa que você obteria um resultado vazio para nomes de arquivos como .zshrc.
${pathname##*/}é expandido para o conteúdo de pathname, menos a correspondência de prefixo mais longa */, ou seja , o caminho completo (se houver um). ${filename%.*}é expandido para o conteúdo de filename, menos a correspondência de sufixo mais curta .*, ou seja , a extensão do arquivo (se houver).
Observe que isso apenas remove o último componente de nome de arquivo introduzido por um ponto; assim paulo.tar.gzse tornaria paulo.tar, não paulo. Estritamente falando, a extensão é .gz(é um arquivo compactado, que por acaso é um tarball; a .tarextensão só se torna realmente significativa quando o arquivo é extraído).
Isso também não funciona corretamente para arquivos de ponto sem extensão, por exemplo.bashrc ou .zshrc; basenameacaba vazio. Os valores padrão podem ser usados para lidar com isso:
Na
zsh
casca::t
modificador ("tail") extrai o último componente do nome do caminho$pathname
(funciona comobasename
).:r
modificador ("root", suponho) extrai o bit do nome do arquivo até a extensão, se houver. A extensão é a parte do nome do arquivo que ocorre após o último ponto. Isso significa que você obteria um resultado vazio para nomes de arquivos como.zshrc
.Os outros modificadores relacionados são
:h
("head"), que funciona comodirname
, e:e
("extensão"), que extrai apenas a extensão.Você pode usar os modificadores de expansão de parâmetros do shell :
${pathname##*/}
é expandido para o conteúdo depathname
, menos a correspondência de prefixo mais longa*/
, ou seja , o caminho completo (se houver um).${filename%.*}
é expandido para o conteúdo defilename
, menos a correspondência de sufixo mais curta.*
, ou seja , a extensão do arquivo (se houver).Observe que isso apenas remove o último componente de nome de arquivo introduzido por um ponto; assim
paulo.tar.gz
se tornariapaulo.tar
, nãopaulo
. Estritamente falando, a extensão é.gz
(é um arquivo compactado, que por acaso é um tarball; a.tar
extensão só se torna realmente significativa quando o arquivo é extraído).Isso também não funciona corretamente para arquivos de ponto sem extensão, por exemplo
.bashrc
ou.zshrc
;basename
acaba vazio. Os valores padrão podem ser usados para lidar com isso:Isso deve fazer o que você quer: