#!/bin/ksh -
file="/usr/opt/filenames.txt"
mondir=/home/pavan
IFS=
while read -r filepattern
do
set -- "$mondir"/$filepattern*
if [ "$#" -eq 1 ] && [ ! -e "$1" ] && [ ! -L "$1" ]; then
printf '%s\n' "$filepattern: 0"
else
printf '%s\n' "$filepattern: $#"
ls -lrtd -- "$@"
fi
done <"$file"
ksh , como o shell Bourne tem essa característica errada de que quando um padrão não combina, ele se expande para si mesmo. Acima, usamos um teste de existência ( [ -e "$1" ] ) para verificar se estamos no caso de um padrão incomparável, mas note que não é à prova de erros.
Por exemplo, para filepattern='[a-z]' , se [a-z]* não corresponder a nenhum arquivo, o padrão não expandido ( [a-z]* ) pode realmente se referir ao arquivo chamado [a-z]* (que não corresponde ao padrão). / p>
Se o seu ksh for baseado em versões recentes de ksh93 , você poderá corrigi-lo com:
#!/bin/ksh -
file="/usr/opt/filenames.txt"
mondir=/home/pavan
IFS=
while read -r filepattern
do
set -- "$mondir"/~(N)$filepattern*
printf '%s\n' "$filepattern: $#"
[ "$#" -eq 0 ] || ls -lrtd -- "$@"
done <"$file"
Esse ~(N) faz com que o glob se expanda a nada quando não corresponde (como o qualificador N glob de zsh ).