У меня есть скрипт, который записывает в несколько файлов, но они мне нужны определенного размера. Поэтому мне интересно, есть ли способ добавить в файл определенное количество нулевых байтов с помощью стандартных инструментов командной строки (например, путем копирования из /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;
}