Comment créer un fichier depuis un terminal en répétant un ensemble de mots à l'infini? J'en ai besoin pour créer un énorme fichier à des fins d'analyse comme une taille de 2 à 4 Go. Actuellement, je copie manuellement les lignes de collage dans le même fichier pour augmenter la taille.
command-line
Nisheet
la source
la source
mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done
?Réponses:
Il existe un moyen simple de répéter une ligne plusieurs fois:
se traduira par out.txt contenant 10 000 lignes disant toutes "nous n'avons pas de bananes".
Pour limiter la sortie à un nombre exact d'octets, utilisez
head
l'-c
option de au lieu de-n
. Par exemple, cela génère exactement 10 Ko de texte:la source
head -c 10000
10 Ko au lieu dehead -n 10000
10 000 lignes.Je ne peux pas recommander de répéter du texte à l' infini , mais vous pouvez créer un fichier ~ 2 Go de texte répété avec python comme ça ...
Cela imprimera "bonjour le monde" 10 fois et fera une nouvelle ligne, et répétera cela 20 000 000 fois, en écrivant le résultat dans le fichier
bigfile
. Si tous vos caractères sont ASCII, alors chacun est un octet, alors calculez correctement en fonction de ce que vous voulez écrire ...Votre processeur peut appartenir. Je manque de RAM si j'essaie de faire plus de 10 000 000 de lignes ...
Je lance un grille-pain cependant
la source
Perl a l'
x
opérateur astucieux :Donc, comme solution simple, vous pourriez simplement écrire votre ligne quelques millions de fois. Par exemple, cette commande a créé un fichier 3G:
Si vous devez spécifier une taille exacte (2 Gio dans ce cas), vous pouvez faire:
la source
Mettez l'ensemble de mots à répéter dans un fichier par exemple
source.txt
. Obtenez la taille dusource.txt
, en octets par exemple par:Décidez de la taille du fichier de destination, par exemple
destination.txt
, 2 Go ou 4 Go ou autre. Convertissez la taille en octets.Divisez la taille du fichier de destination par la taille du fichier source.
bash
ne peut pas faire d'arithmétique en virgule flottante, mais ce n'est pas nécessaire dans ce cas.Utilisez une
for
construction pour répéter unecat source.txt
opération les temps de résultat de division. Ce serait approximativement le plus proche de la taille du fichier de destination que vous pouvez obtenir par répétition. La sortie de l'opération est enregistrée dansdestination.txt
.Par exemple, en supposant que le
source.txt
est de 30 octets et que nous voulons créer un fichier de 2 Go, nous avons besoin de:Ici, je fixe la limite supérieure
((16777216/30))
au moment de l'initialisation; vous pouvez obtenir le résultat et le mettre ici aussi.L'opération prendrait un certain temps; plus la taille est grande
source.txt
, moins il faudra de temps.la source
destination.txt
une fois pour chaque itération de la boucle?Vous pouvez également utiliser une
while
boucle.Exemple: Contenu de
foo.txt
(Ceci est votre source):bar.txt
est vide (il s'agit de votre fichier cible). Vous pouvez maintenant exécuter la boucle suivante pour écrire le contenu defoo.txt
plusieurs fois dansbar.txt
:Explication:
stat --format "%s" bar.txt
affiche la taillebar.txt
en octets.while [ $(stat --format "%s" bar.txt) -lt 150 ]
les actions suivantes seront répétées jusqu'à ce que la taille cible (dans ce cas 150 octets) soit atteinte.cat foo.txt >> bar.txt
ajouter le contenu defoo.txt
àbar.txt
la source
d'abord tirer la commande:
va créer un fichier sur le chemin de taille bs * compter les octets aléatoires, dans notre cas 2048 * 10 = 20Kb. qui peut être changé selon l'exigence.
Cette commande redirige STDIN vers un fichier, vous devrez donc entrer deux lignes, puis appuyez sur Ctrl + D. Ensuite, vous devrez exécuter la commande suivante:
Où n est un entier. Cela créera un fichier contenant 2 ^ (n + 1) lignes, en dupliquant vos deux lignes d'origine. Donc, pour créer un fichier avec 16 lignes, vous feriez:
Voici quelques chiffres supplémentaires pour vous aider à démarrer:
la source
Les FIFO sont probablement ce que vous recherchez. Au lieu d'appeler votre programme avec un fichier donné, vous pouvez lui lier le résultat d'une commande shell via la sous- substitution de processus et le programme verra sa sortie sous forme de fichier en clair. L'avantage ici est que vous n'êtes plus limité par votre espace disque, vous pouvez donc atteindre des tailles de fichiers qui seraient impossibles autrement, tant que votre programme n'a pas besoin de tamponner tout le fichier en premier et qu'il peut simplement l'analyser ligne par ligne. Par exemple, en utilisant la réponse de @hobbs pour générer du contenu:
Cela me donne un fichier de 95 gigaoctets (selon wc) sans frais dans l'espace disque dur et à peine n'importe quelle RAM, juste assez pour tamponner ce que la commande retourne avant qu'elle ne soit lue. C'est à peu près aussi "infiniment" que vous allez en avoir.
la source