basename
leva apenas um sufixo para remover e fornece o nome base (remove os componentes do diretório) que você não quer de qualquer maneira, portanto basename
não é realmente a ferramenta certa para sua necessidade.
A ferramenta tradicional para extrair dados de uma string é expr
:
FN_without_extension=$(expr "x$FN" : 'x\(.*\)\.')
Mas shells modernos (como zsh
, bash
, ksh
, ash
, yash
, todos compatíveis com POSIX sh
...) têm operadores integrados para isso, então você quase nunca precisa de expr
hoje em dia (e é melhor evitar, pois tem alguns problemas).
${var%pattern}
remove o padrão de correspondência de peça (menor) do final de $var
gm convert "$FN" -resize 50% "${FN%.*}.jpg"
Shells como tcsh
ou zsh
têm operadores para remover extensões. Zsh:
gm convert $FN -resize 50% $FN:r.jpg
( r
para nome-raiz ).
Se você quiser remover a extensão, somente se for um dos jpg / png / gif, isso se tornará mais complicado e dependente do shell.
com zsh
:
gm convert $FN -resize 50% ${FN%.(jpg|png|gif)}.jpg
com ksh
:
gm convert "$FN" -resize 50% "${FN%.@(jpg|png|gif)}.jpg"
com bash
:
shopt -s extglob
gm convert "$FN" -resize 50% "${FN%.@(jpg|png|gif)}.jpg"
com expr
:
gm convert "$FN" -resize 50% "$(
expr \( "x$FN" : '\(.*\)\.png$' \| \
"x$FN" : '\(.*\)\.jpg$' \| \
"x$FN" : '\(.*\)\.gif$' \| "x$FN" \) : 'x\(.*\)')".jpg
(sim, é complicado, e isso é para contornar alguns dos problemas de expr
).
Com algumas implementações de expr
, pode ser simplificado para:
expr \( "x$FN" : '\(.*\)\.\(png\|jpg\|gif\)$' \| "x$FN" \) : 'x\(.*\)'
Você também pode usar sed
:
FN_without_ext=$(printf '%s\n' "$FN" |
sed -e '$!b' -e 's/\.png$//;t' -e 's/\.gif$//;t' -e 's/\.jpg$//')
Se você quiser insensível a maiúsculas e minúsculas, poderá substituir o png/gif/jpg
em todas as soluções acima por [pP][nN][gG]...
, algumas shells / tools também podem fazer correspondência insensível a maiúsculas e minúsculas:
zsh
:
setopt extendedglob
FN_without_ext=${FN%.(#i)(gif|png|jpg)}
ksh93
:
FN_without_ext=${FN%.~(i:gif|png|jpg)}
bash
:
shopt -s nocasematch
LC_ALL=C
if [[ $FN =~ (.*)\.(gif|png|jpg)$ ]]; then
FN_without_ext=${BASH_REMATCH[1]}
else
FN_without_ext=$FN
fi
GNU sed
:
FN_without_ext=$(printf '%s\n' "$FN" | sed -r '$s/\.(png|gif|jpg)$//I')