Doutor, dói quando eu faço isso ...
Then don’t do that!
Sério, por que você está tentando atribuir uma única variável a uma lista separada por espaço de nomes de arquivos que contêm espaços? Essa é uma receita para o desastre.
Para responder à sua pergunta implícita: Concordo que as mensagens de erro que você mostra não faz sentido para os comandos que você diz que usou.
Como você não disse como determinar quais arquivos copiar, é difícil saber qual solução funcionará para você e o que não funcionará. Aqui está uma abordagem possível:
︙
f1="/somedir/a file.png"
︙
f2="/somedir/another file.png"
︙
cp "$f1" "$f2" "$f3" … /someotherdir
(Você não precisa do / no final de /someotherdir/ , mas também não faz mal.)
Isso é restringido pelos fatos que
você precisa saber antecipadamente o número máximo de arquivos que você precisará copiar,
e você precisa de alguma maneira de descobrir para qual f variável atribuir cada um.
Isso está perto do que você está fazendo agora:
var="/somedir/a\ file.png /somedir/another\ file.png …"
echo "$var" | while read f1 f2 f3 …
do
cp "$f1" "$f2" "$f3" … /someotherdir
done
O comando read quebrará a string $var nos espaços simples,
e retire as barras invertidas, deixando \ como apenas (espaço).
Mas você ainda precisa saber com antecedência o número máximo de arquivos que você precisará copiar.
(Você precisa da construção de loop while , mesmo que esse loop seja iterado apenas uma vez.)
Talvez este seja próximo:
filelist=/tmp/my_filelist.$$
︙
echo "/somedir/a file.png" >> "$filelist"
︙
echo "/somedir/another file.png" >> "$filelist"
︙
while read filename
do
cp "$filename" /someotherdir
done < "$filelist"
Outra variação é usar um array variável.
Você pode aprender como fazer isso na página bash man.