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
.