Заполнить файл повторяющимся постоянным значением?
Я хотел бы использовать стандартные утилиты, а не скомпилированный код, чтобы эффективно заполнять файл постоянным значением, повторяемым N раз. В простой версии значение представляет собой один байт; в сложной версии - произвольная строка.
Замечания:
- Если значение равно 0, мы имеем
dd if=/dev/zero of=/path/to/file bs=XXX count=YYY
для соответствующих значений XXX и YYY. - Мы, очевидно, можем сделать это с эхом
$value >> file
сделано в цикле, но это должно быть очень медленно.
2 ответа
Давайте принимать
value_to_replicate="whatever"
file_length=65536
output_file="/path/to/file"
например.
Основываясь на предложении @dmadic, мы можем сделать:
bash -c "printf ${value_to_replicate}%.0s {1..${file_length}} > $output_file"
(Если я не "обертываю" заключительную команду, есть проблема с расширением ${file_length}
). Это имеет пропускную способность около 0,6 секунд / МБ в моей системе.
Если строка заканчивается новой строкой, все становится проще:
yes "$value_to_replicate" | head -$file_length > $output_file
И если строка не имеет новых строк, мы также можем сделать это:
yes "$value_to_replicate" | head -$file_length | tr -d '\n' > $output_file
Вы могли бы использовать Perl
следующее:
time perl -e 'print "Hello"x1000000000' > /dev/null
real 0m2.930s
user 0m1.778s
sys 0m1.151s
Итак, 5 Гб за 3 секунды.