Comment ajouter un nombre spécifique d'octets nuls à un fichier? [fermé]

26

J'ai un script qui écrit dans quelques fichiers mais j'en ai besoin d'une taille spécifique. Je me demande donc s'il existe un moyen d'ajouter un nombre spécifique d'octets nuls à un fichier en utilisant des outils de ligne de commande standard (par exemple, en copiant depuis /dev/zero)?

incognito2
la source
1
Cette question semble être hors sujet car elle concerne la programmation, qui appartient à Stack Overflow .
Jenny D dit Réintégrer Monica
Ça oflag=appendmarche pour vous?
Mark K Cowan
Pour clarifier un commentaire de @Mark K Cowan; il veut dire le ddcommandement.
Alexander Pozdneev
FYI semble être fallocateune autre option pour insérer des trous dans un fichier. superuser.com/a/1172904/111432
akostadinov

Réponses:

41

truncateest beaucoup plus rapide que dd. Pour agrandir le fichier avec 10 octets, utilisez:

 truncate -s +10 file.txt 
Pierre
la source
2
C'est beaucoup plus rapide car il va générer un fichier clairsemé, ce que vous voulez la plupart du temps, mais si vous ne voulez pas de fichier clairsemé, l'approche dd fonctionnera.
derobert
34

Vous pouvez également essayer ceci

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

Cela lira à partir de / dev / zero et s'ajoutera à votre fichier NUMBER octets.

Can Kavaklıoğlu
la source
7

Voici un exemple d'ajout de 10 Mo à un fichier en utilisant uniquement 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
Andrey Arapov
la source
5

ma première supposition serait:

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

Fondamentalement, cette commande indique à dd «d'aller» à la fin du fichier et d'ajouter quelques octets lus précédemment à partir de / dev / zero.

Cordialement,

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

ou

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

et pour calculer la taille plus facilement:

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

Si vous remplissez votre fichier avec des octets nuls, je suppose que vous manipulez le fichier dans un char *in C. Si tel est le cas, vous n'aurez peut-être pas besoin de remplir le fichier avec des octets nuls, en ajoutant uniquement un octet nul à la fin du fichier, puis le remplir avec des octets aléatoires pourrait être suffisant. Dans ce cas, le programme C ci-dessous serait très efficace (à utiliser uniquement sur des fichiers plus petits que le 2ème paramètre, sinon les données seraient écrasées). Il pourrait même faire ce que vous voulez (remplissage avec des octets nuls) car la lseekdéfinition de la fonction indique que:

La fonction lseek () doit permettre de définir le décalage de fichier au-delà de la fin des données existantes dans le fichier. Si des données sont écrites ultérieurement à ce stade, les lectures ultérieures de données dans l'espace doivent renvoyer des octets avec la valeur 0 jusqu'à ce que les données soient réellement écrites dans l'espace.

Dans ce cas, le 1er appel à lseeket writepourrait être supprimé. Mais les tests doivent être effectués sur votre système en premier ...

#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;
}
jfg956
la source