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.