Wie hänge ich eine bestimmte Anzahl von Null-Bytes an eine Datei an? [geschlossen]


26

Ich habe ein Skript, das in einige Dateien schreibt, aber ich benötige sie in einer bestimmten Größe. Ich frage mich also, ob es eine Möglichkeit gibt, eine bestimmte Anzahl von Null-Bytes mit Standard-Befehlszeilentools an eine Datei anzuhängen (z. B. durch Kopieren von /dev/zero).


1
Diese Frage scheint nicht zum Thema zu gehören, da es um die Programmierung geht, die in Stack Overflow enthalten ist .
Jenny D sagt Reinstate Monica

Arbeitet oflag=appendfür Sie?
Mark K Cowan

Um einen Kommentar von Mark K Cowan zu verdeutlichen; er meint den ddBefehl.
Alexander Pozdneev

FYI scheint fallocateeine weitere Möglichkeit zu sein, Löcher in eine Datei einzufügen. superuser.com/a/1172904/111432
akostadinov

Antworten:


41

truncateist viel schneller als dd. Um die Datei mit 10 Bytes zu vergrößern, verwenden Sie:

 truncate -s +10 file.txt 

2
Es ist viel schneller, weil es eine Sparse-Datei generiert, was Sie die meiste Zeit wollen - aber wenn Sie keine Sparse-Datei wollen, wird der dd-Ansatz funktionieren.
Derobert

34

Sie können dies auch versuchen

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

Dies liest aus / dev / zero und hängt an die NUMBER Bytes Ihrer Datei an.


7

Unten sehen Sie ein Beispiel für das Anhängen von 10 MB an eine Datei, die nur dd verwendet.

[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

Meine erste Vermutung wäre:

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

Grundsätzlich weist dieser Befehl dd an, am Ende der Datei zu "gehen" und einige zuvor aus / dev / zero gelesene Bytes hinzuzufügen.

Grüße,


2
cat "your file" /dev/zero | head -c "total number of bytes"

oder

head -c "number of bytes to add" /dev/zero >> "your_file"

und um die Größe einfacher zu berechnen:

head -c $(( "total number of bytes" - $(stat -c "%s" "your_file") )) /dev/zero >> "your_file"

0

Wenn Sie Ihre Datei mit Null-Bytes auffüllen, wird davon ausgegangen, dass Sie die Datei in a char *in C bearbeiten. In diesem Fall müssen Sie die Datei möglicherweise nicht mit Null-Bytes auffüllen , sondern fügen am Ende nur ein Null-Byte hinzu der Datei und dann mit zufälligen Bytes Auffüllen könnte genug sein. In diesem Fall ist das C-Programm sehr effizient (nur für Dateien, die kleiner als der 2. Parameter sind, da sonst Daten überschrieben werden). Es kann sogar das tun, was Sie möchten (Auffüllen mit Null-Bytes), da die lseekFunktionsdefinition Folgendes angibt:

Mit der Funktion lseek () kann der Dateiversatz über das Ende der in der Datei vorhandenen Daten hinaus festgelegt werden. Wenn zu diesem Zeitpunkt später Daten geschrieben werden, geben nachfolgende Lesevorgänge von Daten in der Lücke Bytes mit dem Wert 0 zurück, bis tatsächlich Daten in die Lücke geschrieben werden.

In diesem Fall könnte der 1. Anruf an lseekund writeentfernt werden. Aber Tests sollten zuerst auf Ihrem System durchgeführt werden ...

#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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.