У меня есть файл, который я хочу заполнить, пока он не достигнет 16 МБ (16777216 байт). В настоящее время это 16515072 байта. Разница составляет 262144 байта.
Как мне это дополнить?
Это не похоже на работу:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
bs=1
вdd
моем опыте очень дорогой.truncate -s 16M thefile
Ответы:
Удалите
of=largerfile.txt
и добавьте стандартный вывод в файл:источник
seek
это правильный вариант здесь.Помимо ответов для получения физического отступа, вы также можете оставить большую часть пространства дополнения в файле просто пустым («дыры»),
seek
перейдя в новую конечную позицию файла и написав один символ:(который имеет преимущество в том, что он гораздо более производительный, особенно с ним
bs=1
, и не занимает много дополнительного дискового пространства).Этот метод работает даже без добавления каких-либо символов, используя
if=/dev/null
конечный желаемый размер файла:Производительный вариант решения с физическим заполнением, которое использует блоки большего размера:
источник
truncate -s +262144 largerfile.txt
также будет быстро.Лучшим ответом здесь является Janis's (выше), потому что он позволяет забыть о текущем размере файла и заполнить его непосредственно до нужного размера без каких-либо вычислений.
Он также использует разреженные файлы, а добавление / dev / zero - нет.
Ответ может быть более аккуратным, потому что 'count' может быть равен 0, и вы все равно получаете заполнение:
(Изменить: это правильно для GNU dd, но поведение
count=0
зависит от платформы, см. Комментарии)источник
count=0
неcount
указан , но, как правило, такой же, как когда не был указан параметр. Больше проблем:dd
усекает файл до 16777216 байт, но если вы надеетесь, что это создает дыру в конце, вы ошибаетесь, поскольку вам сначала нужно будет записать данные после дыры, а затем усечь их до размера, который не содержит данных ,dd if=/dev/zero of=somefile
это так же, какdd if=/dev/zero of=somefile count=0
? Попытайся.count=0
так же, как если бы вы вообще не указали параметр count. Это верно по крайней мере для всех реализаций, которые были получены из оригинальных источников. Попробуйте, кажется, вы никогда не работали с оригинальнойdd
командой.count
значения «игнорировать этот параметр». Вы можете найти что-нибудь? Без такой документацииcount=0
означает «записать нулевые блоки», и любое отклонение от этого является ошибкой ... (первоисточники или нет).Вы должны использовать
dd
? Если вы хотите, чтобы файл имел определенную (логическую) длину, просто запишите ноль в нужную позицию. Байты между предыдущим концом и записанным байтом будут отображаться как имеющие нулевые байты. Вот пример использования Perl.Почему «- 2» в строке? Сценарий запишет байт, поэтому мы вычитаем 1 для поиска позиции перед этим байтом. Мы снимаем другую, потому что позиция поиска индексируется нулем.
источник