J'ai un fichier que je veux remplir jusqu'à ce qu'il atteigne 16 Mo (16777216 octets). Actuellement, il est de 16515072 octets. La différence est de 262144 octets.
Comment le rembourrer?
Cela ne semble pas fonctionner:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
bs=1
indd
est, selon mon expérience, un temps d'exécution très coûteux.truncate -s 16M thefile
Réponses:
Déposez
of=largerfile.txt
et ajoutez stdout au fichier:la source
seek
est une bonne option ici.Outre les réponses pour obtenir un remplissage physique, vous pouvez également laisser la plupart de l'espace de remplissage dans le fichier juste vide ("trous"), en
seek
entrant dans la nouvelle position finale du fichier et en écrivant un seul caractère:(qui a l'avantage d'être beaucoup plus performant, notamment avec
bs=1
, et n'occupe pas de grandes quantités d'espace disque supplémentaire).Cette méthode semble fonctionner même sans ajouter de caractère, en utilisant
if=/dev/null
et la taille de fichier finale souhaitée:Une variante performante d'une solution de remplissage physique qui utilise des blocs de plus grandes tailles est:
la source
truncate -s +262144 largerfile.txt
serait également rapide.La meilleure réponse ici est celle de Janis (ci-dessus) car elle vous permet d'oublier la taille du fichier actuel et de passer directement à la taille souhaitée sans aucun calcul.
Il tire également parti des fichiers clairsemés, ce qui n'est pas le cas avec l'ajout de / dev / zero.
La réponse pourrait être plus nette, car `` count '' peut être égal à 0 et vous obtenez toujours le remplissage:
(Edit: c'est correct pour GNU dd, mais le comportement de
count=0
est spécifique à la plateforme, voir les commentaires)la source
count=0
n'est pas spécifié, mais est généralement le même que lorsqu'aucuncount
paramètre n'a été spécifié. Plus de problèmes:dd
tronque le fichier à 16777216 octets, mais si vous espérez que cela crée un trou à la fin, vous vous trompez car vous devrez d'abord écrire des données après le trou et ensuite le tronquer à une taille qui ne contient aucune donnée .dd if=/dev/zero of=somefile
c'est la même chose quedd if=/dev/zero of=somefile count=0
? Essayez-le.count=0
est la même que si vous n'aviez pas du tout spécifié de paramètre de comptage. Cela est vrai au moins pour toutes les implémentations dérivées des sources d'origine. Essayez-le, il semble que vous n'ayez jamais travaillé avec ladd
commande d' origine .count
signifier «ignorer ce paramètre». Pouvez-vous en trouver? Sans une telle documentation,count=0
signifie «écrire zéro bloc» et tout écart par rapport à cela est un bug ... (sources originales ou non).Devez-vous utiliser
dd
? Si vous voulez qu'un fichier ait une longueur (logique) particulière, écrivez simplement un zéro à la position souhaitée. Les octets entre la fin précédente et l'octet écrit seront affichés comme ayant des octets nuls. Voici un exemple d'utilisation de perl.Pourquoi le "- 2" dans la ligne? Le script écrit un octet, nous soustrayons donc 1 pour rechercher la position avant cet octet. Nous enlevons l'autre parce que la position de recherche est indexée sur zéro.
la source