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


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.