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


26

У мене є сценарій, який записує в декілька файлів, але мені потрібен певний розмір. Тож мені цікаво, чи існує спосіб додавання до файлу певної кількості нульових байтів за допомогою стандартних інструментів командного рядка (наприклад, шляхом копіювання з /dev/zero)?


1
Це питання видається поза темою, оскільки йдеться про програмування, яке належить до переповнення стека .
— Дженні Д каже, що повернешся Моніку

Чи oflag=appendпрацює для вас?
— Марк К Коуан

Щоб уточнити коментар @Mark K Cowan; він означає ddкоманду.
— Олександр Позднеєв

FYI, здається, fallocateє ще одним варіантом, щоб вставити отвори у файл. superuser.com/a/1172904/111432
— akostadinov

Відповіді:


41

truncateнабагато швидше, ніж dd. Щоб виростити файл з 10 байтами, використовуйте:

 truncate -s +10 file.txt 

2
Це набагато швидше, тому що він генерує розріджений файл, що саме ви хочете більшу частину часу, але якщо ви не хочете розрідженого файлу, підхід DD буде працювати.
— derobert

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

Якщо ви додаєте файл з нульовими байтами, я гадаю, що ви маніпулюєте файлом в 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.