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


26

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


1
Этот вопрос, кажется, не по теме, потому что он касается программирования, которое относится к переполнению стека .
— Дженни Ди говорит восстановить Монику

У oflag=appendтебя работает?
— Марк К Коуэн

Чтобы уточнить комментарий @Mark K Cowan; он имеет в виду ddкоманду.
— Александр Позднеев

К вашему сведению, fallocateэто еще один способ вставить дыры в файл. superuser.com/a/1172904/111432
— акостадинов

Ответы:


41

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

 truncate -s +10 file.txt 

2
Это намного быстрее, потому что он будет генерировать разреженный файл, чего вы хотите большую часть времени, но если вам не нужен разреженный файл, подход dd сработает.
— Дероберт

34

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

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

Это будет читать из / dev / zero и добавлять к вашему файлу NUMBER байтов.


7

Ниже приведен пример добавления 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

5

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

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

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

С Уважением,


2
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"

0

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

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

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

#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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.