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


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.