Cascas POSIX (por exemplo, bash, dash, ksh,…) aceitam uma construção ${var%suffix}
que
pode ser usado para remover a parte traseira do valor de um
variável. Por exemplo, se path="sub/file.txt"
, então ${path%.txt}
expande para sub/file
.
Há uma construção simétrica para remover um prefixo: ${var#prefix}
. O prefixo pode ser um padrão. Dobrar o #
retira o prefixo correspondente mais longo. Por exemplo, se path=sub/dir/file.txt
, então ${path##*/}
será expandido para file.txt
(e ${path#*/}
será expandido para dir/file.txt
). O mesmo vale para sufixos e %
.
Então, no seu caso, você poderia escrever isto (note que você não pode combinar o prefixo de decapagem e o sufixo removendo em uma única expansão, pelo menos não apenas com construções POSIX):
for f in sub/*.txt; do
base=${f%.txt}
base=${base##*/}
enscript -b "" -o "$base.ps" "$f"
ps2pdf "$base.ps" "$base.pdf"
done
Alternativamente, o GNU
O comando basename aceita um
segundo argumento opcional, que é a extensão de arquivo a ser removida. Para
Por exemplo, se $f
for file.txt
, então $(basename $f .txt)
se expandirá para
file
.
Observe, no entanto, que basename
remove todas as informações do caminho, exceto
o último componente, então se você quiser remover apenas a extensão você
tem que colocar isso de volta (veja o
comando dirname ).