O operador de teste condicional da Bash, [[
, pode comparar nomes de arquivos com uma expressão regular e extrair expressões com parênteses:
shopt -s nocaseglob
for f in *booklets*
do
[[ $f =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}"
done
Isso fará um loop em todos os arquivos que corresponderem à palavra (não sensível a maiúsculas e minúsculas) "livretos" no diretório atual. Se você quer que algo seja executado em um único arquivo por vez, você pode simplificar o que está acima e colocá-lo em um script ou uma função:
extractnumber ()
(
shopt -s nocaseglob
if [ ! -f "$1" ]; then echo "File $1 not found!"; return 1; fi
[[ $1 =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}";
)
... e depois ligue:
$ extractnumber 35BOOKLETS.pdf
35
$ extractnumber MATH232\ Exam\ 01\ 99\ booklets.pdf
99
$ extractnumber 101s18-exam02--100-booklets.pdf
100
$ extractnumber foobar
File foobar not found!