Comment créer un gros fichier sous UNIX?

17

J'ai trouvé un moyen dans Windows de faire une telle chose

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

Existe-t-il un moyen sous UNIX de copier un fichier, de l'ajouter puis de répéter le processus? Quelque chose comme ça for .. cat file1.txt > file1.txt?

Thomas Lee
la source
Pourquoi copier le fichier et l'ajouter au lieu de simplement l'ajouter?
123
@ 123 append est bon, mais comment faire la boucle?
Thomas Lee
4
for i in {1..1000000};do echo "string" >> file;doneen bash.
123
9
Doit-il s'agir d'un fichier texte? Vous pouvez créer n'importe quelle taille de fichier à partir de / dev / zero ou / dev / urandom.
RealSkeptic
2
Je m'attendrais type file >> fileà fonctionner dans une boucle infinie (au moins dès qu'il est suffisamment grand pour ne pas tenir dans un tampon).
Stéphane Chazelas

Réponses:

29
yes "Some text" | head -n 100000 > large-file

Avec csh/ tcsh:

repeat 10000 echo some test > large-file

Avec zsh:

{repeat 10000 echo some test} > large-file

Sur les systèmes GNU, voir aussi:

seq 100000 > large-file

Ou:

truncate -s 10T large-file

(crée un fichier fragmenté de 10 To (très volumineux mais ne prend pas de place sur le disque)) et les autres alternatives décrites dans "Créer un fichier de test avec beaucoup de zéro octet" .


Faire cat file >> file serait une mauvaise idée.

Tout d'abord, cela ne fonctionne pas avec certaines catimplémentations qui refusent de lire des fichiers identiques à leur fichier de sortie. Mais même si vous contournez ce problème en faisant cat file | cat >> file, s'il fileest plus grand que catle tampon interne de, cela entraînerait catune exécution dans une boucle infinie car il finirait par lire les données qu'il a écrites plus tôt.

Sur les systèmes de fichiers soutenus par un disque dur rotatif, il serait également assez inefficace (après avoir atteint une taille supérieure à celle qui serait éventuellement mise en cache en mémoire) car le lecteur devrait faire des allers-retours entre l'emplacement où lire les données, et que où l'écrire.

Stéphane Chazelas
la source
19
Ou dd if=/dev/zero of=large-file bs=1024 count=1024pour un fichier de 1 Mo
doneal24
7
@ DougO'Neal je trouve dd if=/dev/zero of=test bs=1M count=1plus clair.
123
4
@ DougO'Neal, voir Créer un fichier de test avec beaucoup d'octets zéro
Stéphane Chazelas
1
Ou utilisez / dev / urandom au lieu de / dev / zero si vous voulez des données aléatoires.
user253751
3
@ robertotomás oui, tout le monde utilise dd, mais je n'ai jamais compris pourquoi. En fait, je pense que je ne l'ai utilisé que pour lire un MBR ou des tâches marginales similaires. D'après mon expérience, d'autres outils sont plus rapides, plus simples et plus sûrs pour la grande majorité des cas d'utilisation dd. Je pense que c'est l'un de ces cas où commun! = Optimal, comme sudo suou cat file | grep foo.
terdon
22

Vous pouvez créer un fichier volumineux sur Solaris en utilisant:

mkfile 10g /path/to/file

Une autre façon qui fonctionne sur Solaris (et Linux):

truncate -s 10g /path/to file

Il est également possible d'utiliser:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Lambert
la source
dd one est comme un téraoctet
123
1
Définir "un gros fichier" :-) Mais j'ai édité depuis les autres samples tous en état 10g ...
Lambert
truncate Impossible d'exécuter 'truncate'. Aucun fichier ou répertoire de ce type ne semble être uniquement Linux.
schily
truncateexiste sur Solaris 11.2+
Lambert
11

Le moyen le plus rapide possible de créer un gros fichier dans un système Linux est fallocate:

sudo fallocate -l 2G bigfile

fallocatemanipule le système de fichiers, et n'écrit pas réellement dans les secteurs de données par défaut, et en tant que tel est extrêmement rapide. L'inconvénient est qu'il doit être exécuté en tant que root.

En l'exécutant successivement en boucle, vous pouvez remplir le plus grand des systèmes de fichiers en quelques secondes.

De man fallocate

fallocate est utilisé pour manipuler l'espace disque alloué pour un fichier, soit pour le désallouer, soit pour le préallouer.
Pour les systèmes de fichiers qui prennent en charge l'appel système fallocate, la préallocation se fait rapidement en allouant des blocs et en les marquant comme non initialisés, ne nécessitant pas d'E / S sur les blocs de données. C'est beaucoup plus rapide que de créer un fichier en le remplissant de zéros.
Pris en charge pour XFS (depuis Linux 2.6.38), ext4 (depuis Linux 3.0), Btrfs (depuis Linux 3.7) et tmpfs (depuis Linux 3.5).

Rui F Ribeiro
la source
1
Ce devrait être la réponse acceptée. Facile et rapide.
ardochhigh
8

Cela continuera jusqu'à ce que vous CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

Attention cependant, car vous pouvez obtenir des centaines de milliers de lignes / seconde ...

De man yes:

yes - output a string repeatedly until killed
Point d'interrogation
la source
Il s'agit d'une méthode très simple pour créer un gros fichier dans un environnement Linux.
Chaminda Bandara
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtvous permettrait d'obtenir un montant précis. (-n $ TARGET_NUMBER_OF_LINES). yesmourrait automatiquement à la suite d'un «tuyau cassé» à la headfin parce que le nombre cible a été atteint.
PypeBros
4

Si je vous comprends bien, vous cherchez quelque chose comme:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

Cela va créer un fichier avec 22 répétitions de "ligne de test". Si vous voulez une taille de fichier spécifique, vous pouvez utiliser quelque chose comme ça (sous Linux). 1024 est un kilo-octet:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Personnellement, lorsque je veux créer un fichier volumineux, j'utilise deux fichiers et les catalyse l'un dans l'autre. Vous pouvez répéter le processus jusqu'à atteindre la taille souhaitée (1 Mo ici):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Notez que cette solution dépassera souvent la taille souhaitée car si le fichier est en dessous de la limite, tout y sera à nouveau intégré.

Enfin, si tout ce que vous voulez, c'est un fichier de la taille souhaitée et que vous n'en avez pas besoin pour contenir quoi que ce soit, vous pouvez utiliser truncate:

truncate -s 1M file
terdon
la source
1
Le catfichier a-t-il réellement l'avantage de simplement s'ajouter? Il semblerait que cela prendrait plus de temps car il doit bifurquer deux processus à chaque boucle et également déplacer le contenu entier plusieurs fois.
123
1
@ 123 vitesses. L' catapproche est beaucoup, beaucoup plus rapide. Cela n'a de sens que pour créer des fichiers énormes, mais cela a créé un fichier 545M en 10 secondes sur ma machine. La même whileboucle avec echo "test line" >> filecréé un fichier 96K dans le même temps.
terdon
Je suppose que le problème avec l'approche "chat", c'est qu'elle croît de façon exponentielle. Au démarrage de la deuxième itération, 'newfile' a déjà 1 ligne et 'file' en a 2, et quand c'est fait, 'newfile' est maintenant de 3 lignes et 'file' est 5. Ensuite, 'newfile' sera 8 et ' fichier "aura 13 ans. Suivant (21, 34), etc.
PypeBros
inconvénient: cela peut prendre plus d'espace disque (> = 1,5 * taille_désirée) que la taille du fichier cible lors de la création du fichier.
PypeBros
btw. Si vous en avez truncateautour, vous pouvez truncate -s 1Gcréer le fichier en premier lieu. unix.stackexchange.com/a/269184/85549 . Vous pouvez le remplacer par un head -c $DESIRED_SIZE, éventuellement dans la whileboucle.
PypeBros
3

En canalisant le contenu de /dev/urandomto, headvous pouvez rediriger la sortie vers un fichier, donc:

 cat /dev/urandom | head --bytes=100 >> foo.bar

Vous donnera un fichier avec 100 octets de déchets.

dépensier
la source
1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

même effet de votre script windows mais en bash, vous ne pouvez pas concaténer directement un fichier.

MelBurslan
la source
En plus d'oublier l' .txtextension, vous laissez 2 gros fichiers à la fin.
ott--