Créer un fichier de test avec beaucoup d'octets zéro

25

Je sais comment créer un fichier vide:

touch /var/tmp/nullbytes

mais comment puis-je créer un fichier de 1 Mo qui ne contient que des octets null sur la ligne de commande avec bash?

rubo77
la source
Concerne la question SU: superuser.com/q/609020/151431
terdon
1
+1. Question interessante. Quelqu'un pourrait-il bien vouloir préciser dans quels scénarios un tel fichier serait nécessaire ...?
Kent Pawar
1
J'en avais besoin pour simuler un crash sur chkrootkit: unix.stackexchange.com/questions/86866/…
rubo77

Réponses:

56

Avec GNU truncate:

truncate -s 1M nullbytes

(en supposant qu'il nullbytesn'existait pas auparavant) créerait un fichier fragmenté de 1 mégaoctet. C'est un fichier qui semble rempli de zéros mais qui ne prend pas de place sur le disque.

Sans truncate, vous pouvez utiliser à la ddplace:

dd bs=1048576 seek=1 of=nullbytes count=0

(avec certaines ddimplémentations, vous pouvez remplacer 1048576 par 1M)

Si vous préférez que l'espace disque soit alloué , sous Linux et certains systèmes de fichiers, vous pouvez faire:

fallocate -l 1M nullbytes

Cela alloue l'espace sans réellement écrire de données sur le disque (l'espace est réservé mais marqué comme non initialisé).

dd < /dev/zero bs=1048576 count=1 > nullbytes

Écrira en fait les zéros sur le disque. C'est le moins efficace, mais si vous avez besoin que vos disques tournent pour accéder à ce fichier, c'est celui que vous voudrez.

Ou la manière de @ mikeserv de tromper ddpour générer les octets NUL:

dd bs=1048576 count=1 conv=sync,noerror 0> /dev/null > nullbytes

Une alternative avec GNU headqui n'implique pas d'avoir à spécifier une taille de bloc (1M est OK, mais 10G par exemple ne le ferait pas):

head -c 1M < /dev/zero > nullbytes

Ou pour obtenir une barre de progression:

pv -Ss 1M < /dev/zero > nullbytes
Stéphane Chazelas
la source
Ne pas utiliser truncatepour créer un fichier vide à utiliser comme volume d'échange… cela ne fonctionnera pas! Utilisez dddans ce cas à la place.
Elias Probst
1
@EliasProbst, copie ITYM de / dev / zero à la place , n'utilisez pas de fichier fragmenté . ddpeut également créer des fichiers clairsemés comme je l'ai montré.
Stéphane Chazelas
2
fallocate est le moyen le meilleur et le plus rapide de créer car il réserve de l'espace et le fait rapidement mais il ne prend pas la peine d'écrire quoi que ce soit ( stackoverflow.com/questions/257844/… )
curratore
... ou bs=1kx1k. Ou <&1 dd bs=1kx1k conv=sync,noerror count="$rpt" | cat >filepour l'écriture littérale sur le disque. Pas 100% sur la perte d'efficacité en forçant l'erreur de lecture.
mikeserv
27
dd if=/dev/zero of=/var/tmp/nullbytes count=1 bs=1M
Zelda
la source