A melhor maneira de iterar as linhas em um arquivo é usando while
:
while read line; do cp /source/"$line" /dest/; done < file_copy
E enquanto o acima é bom o suficiente para a maioria dos casos, uma solução mais robusta (embora raramente necessária) é:
while IFS= read -r line; do cp /source/"$line" /dest/; done < file_copy
O IFS=
impede que o espaço em branco seja cortado no início e no final de uma linha. -r
impede que as barras invertidas sejam descartadas.
Em relação ao seu comando original:
-
Há um uso inútil do gato .
-
Você não deve ler as linhas com
for
porque é propenso a erros quando suas linhas contêm espaço em branco. Na prática, se você estiver usandofor
com qualquer outra coisa além de criar um loop sobre nomes de arquivos gerados pelo shell (por exemplo,for f in *.csv
), provavelmente você está fazendo algo errado. -
Você também deve citar suas variáveis para evitar que os nomes de arquivos com espaços sejam divididos em vários argumentos.