1. Uma abordagem simples:
echo 'Hello, world.' > foo.txt
< file.txt xargs -L 1 cp foo.txt
rm foo.txt
O comando cat é muito usado em excesso;
quando vir cat filename | command ,
você pode alterá-lo para command < filename ou
equivalentemente, < filename command .
A opção -L 1 para xargs diz
ler apenas uma linha de file.txt de cada vez;
então, se file.txt contiver file1 e file2 (em linhas separadas),
então xargs será executado
cp foo.txt file1
cp foo.txt file2
Eu presumo que o resto seja auto-explicativo.
Se você quiser colocar tudo isso em uma linha, apenas junte as linhas com && :
echo 'Hello, world.' > foo.txt && xargs -L 1 cp foo.txt < file.txt && rm foo.txt
Mudei o < file.txt para o final do comando xargs ,
que é onde as pessoas costumam colocá-lo.
2. Mais flexível
Você provavelmente vai querer fazer algo mais complexo e sofisticado de escrever a mesma linha única para cada arquivo. Este comando:
xargs sh -c 'for f do echo "Hello, world." > "$f"; done' sh < file.txt
passa os nomes dos arquivos para uma invocação do shell ( sh ),
que pode fazer qualquer coisa no arquivo nomeado (referenciado como "$f" )
que você poderia fazer a partir do prompt do shell.
E, obviamente, com esse método,
você não precisa criar e excluir um arquivo temporário.
3. Sem usar xargs
Você pode simplificar o acima para
while IFS= read -r f
do
echo 'Hello, world.' > "$f"
done < file.txt
que é essencialmente o mesmo que a resposta anterior,
exceto que desta vez o shell lê o arquivo file.txt ,
então você não precisa de xargs .