Tem certeza de que é /data//links/a 1 na mensagem de erro? Eu esperaria /links//data/a 1 …
Blanks não são o problema. Veja o que seu echo deu a você. Seu $file já contém /data/ string. O pedaço de código
"/data/${file}" "/links/${file}"
adiciona /data/ ou /links/ a uma string onde /data/ já é.
A solução mais fácil é tornar $file não contendo /data/ :
cd /data
for file in *; do
# the rest of your script
# in general remember you're in a different dir now
Como alternativa, você pode manter for file in /data/*; e remover a parte excessiva mais tarde:
for file in /data/*; do
file=$(basename "$file")
# the rest of your script
A solução acima gerará vários processos porque basename é um executável separado. Por esse motivo, você pode querer que o trabalho seja feito pelo próprio shell:
for file in /data/*; do
file="${file##*/}"
# the rest of your script
A sintaxe ${file##*/} imprime $file , mas remove a string mais longa que corresponde a */ da frente dela. O efeito é que lhe dá o que quer que exista após o último / .