Назад | Перейти на главную страницу

Как добавить в файл определенное количество нулевых байтов?

У меня есть скрипт, который записывает в несколько файлов, но они мне нужны определенного размера. Поэтому мне интересно, есть ли способ добавить в файл определенное количество нулевых байтов с помощью стандартных инструментов командной строки (например, путем копирования из /dev/zero)?

truncate намного быстрее, чем dd. Чтобы увеличить размер файла до 10 байт, используйте:

 truncate -s +10 file.txt 

Вы также можете попробовать это

dd if=/dev/zero bs=1 count=NUMBER >> yourfile

Это будет читать из / dev / zero и добавлять в ваш файл ЧИСЛО байтов.

Ниже приведен пример добавления 10 МБ к файлу с использованием только dd.

[root@rhel ~]# cp /etc/motd ./test
[root@rhel ~]# hexdump -C test |tail -5
000003e0  0a 0a 3d 3d 3d 3d 3e 20  54 65 78 74 20 6f 66 20  |..====> Text of |
000003f0  74 68 69 73 20 6d 65 73  73 61 67 65 20 69 73 20  |this message is |
00000400  69 6e 20 2f 65 74 63 2f  6d 6f 74 64 20 3c 3d 3d  |in /etc/motd <==|
00000410  3d 3d 0a                                          |==.|
00000413

[root@rhel ~]# dd if=/dev/zero of=/root/test ibs=1M count=10 obs=1M oflag=append conv=notrunc
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0208541 s, 503 MB/s

[root@rhel ~]# hexdump -C test |tail -5
00000410  3d 3d 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |==..............|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00a00410  00 00 00                                          |...|
00a00413

мое первое предположение было бы:

dd if=/dev/zero of=myfile bs=1 count=nb_of_bytes seek=$(stat -c%s myfile)

По сути, эта команда говорит dd «перейти» в конец файла и добавить несколько байтов, ранее считанных из / dev / zero.

С Уважением,

cat "your file" /dev/zero | head -c "total number of bytes"

или

head -c "number of bytes to add" /dev/zero >> "your_file"

и чтобы легче вычислить размер:

head -c $(( "total number of bytes" - $(stat -c "%s" "your_file") )) /dev/zero >> "your_file"

Если вы заполняете свой файл нулевыми байтами, я предполагаю, что вы манипулируете файлом в char * в C. Если это так, возможно, вам не потребуется заполнять файл нулевыми байтами, достаточно будет только добавить нулевой байт в конец файла, а затем заполнить его случайными байтами. В этом случае приведенная ниже программа на C будет очень эффективной (ее можно использовать только с файлами, размер которых меньше 2-го параметра, в противном случае данные будут перезаписаны). Он может даже делать то, что вы хотите (заполнение нулевыми байтами), как lseek определение функции гласит, что:

Функция lseek () позволяет устанавливать смещение файла за пределами конца существующих данных в файле. Если данные записываются позже в этот момент, последующие чтения данных в промежутке должны возвращать байты со значением 0 до тех пор, пока данные не будут фактически записаны в промежуток.

В этом случае 1-й звонок на lseek и write может быть удален. Но сначала нужно провести тесты на вашей системе ...

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

/* 1st parameter: a file name, 2nd parameter: a file size. */
int main(int argc, char ** args) {
   int nfd = open(args[1], O_WRONLY);
   lseek(nfd, 0, SEEK_END);
   write(nfd, "\0", 1);
   lseek(nfd, atoi(args[2]) - 1, SEEK_SET);
   write(nfd, "\0", 1);
   close(nfd);
   return 0;
}