1. Простой подход:
echo 'Hello, world.' > foo.txt
< file.txt xargs -L 1 cp foo.txt
rm foo.txt
Команда cat
сильно перегружена; когда вы видите cat filename | command
, вы можете изменить его на command < filename
или, что эквивалентно, < filename command
.
Опция -L 1
для xargs
говорит ему о необходимости читать только одну строку из file.txt
за раз; поэтому, если file.txt
содержит file1
и file2
(в отдельных строках), xargs
будет запущен
cp foo.txt file1
cp foo.txt file2
Я полагаю, остальное не требует пояснений.
Если вы хотите поместить все это в одну строку, просто объедините строки с &&
:
echo 'Hello, world.' > foo.txt && xargs -L 1 cp foo.txt < file.txt && rm foo.txt
Я переместил < file.txt
в конец команды xargs
, куда люди обычно ее помещают.
2. Более гибкий
Вы, вероятно, захотите сделать что-то более сложное и сложное, чем записать одну и ту же строку в каждый файл.
Эта команда:
xargs sh -c 'for f do echo "Hello, world." > "$f"; done' sh < file.txt
передает имена файлов в качестве вызова оболочки sh
который затем может сделать что - нибудь к имени файла (ссылка как "$f"
, что вы могли бы сделать из командной строки.
И, очевидно, с этим методом вам не нужно создавать и удалять временный файл.
3. Без использования xargs
Вы можете упростить вышеизложенное до
while IFS= read -r f
do
echo 'Hello, world.' > "$f"
done < file.txt
который по сути совпадает с предыдущим ответом, за исключением того, что на этот раз оболочка читает файл file.txt
, поэтому вам не нужны xargs
.