#!/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
).