Para tornar $ file local: você pode usar local file
antes de atribuir a ele.
Para arquivos com espaços: não analise ls , use um caractere curinga e use aspas duplas em torno de referências de variáveis:
local file
for file in "$dir"/*; do # Note that $file will contain $dir as well as the filename
if [ -d "$file" ]; then
echo "Directory: $file"
fi
done
Se você quiser armazenar os nomes dos arquivos antes de iniciar o loop, use uma matriz em vez de uma variável simples:
local -a filelist
filelist=("$dir"/*)
local file
for file in "${filelist[@]}"; do
...
Veja BashFAQ # 20: "Como posso encontrar e manusear com segurança nomes de arquivos contendo novas linhas, espaços ou ambos?" para exemplos mais complexos e mais truques.