Заполнить файл повторяющимся постоянным значением?

Я хотел бы использовать стандартные утилиты, а не скомпилированный код, чтобы эффективно заполнять файл постоянным значением, повторяемым 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 секунды.

Другие вопросы по тегам