Créez de nombreux fichiers avec un contenu aléatoire


23

Je recherche une commande pour créer plusieurs (milliers de) fichiers contenant au moins 1 Ko de données aléatoires.

Par exemple,

Name            size
file1.01        2K
file2.02        3K
file3.03        5K
etc.

Comment puis-je créer de nombreux fichiers comme celui-ci?


Qu'entendiez-vous par «exclusif»? Cela n'a pas de sens dans le contexte, vous avez donc probablement utilisé le mauvais mot.
Gilles 'SO- arrête d'être méchant'

Je voulais dire que les fichiers ne peuvent pas avoir le même contenu.
João José

Donc, exclusif aurait signifié unique.
somehume

Réponses:


25

Puisque vous n'avez aucune autre exigence, quelque chose comme ça devrait fonctionner:

#! /bin/bash
for n in {1..1000}; do
    dd if=/dev/urandom of=file$( printf %03d "$n" ).bin bs=1 count=$(( RANDOM + 1024 ))
done

(cela nécessite bashau moins pour {1..1000}).


2
Cela a besoin bashpour de nombreuses raisons, y compris $((…))et $RANDOM. Même $(…)peut ne pas exister dans chaque shell.
G-Man dit `` Réintègre Monica ''

1
@ G-Man, dans tous les cas, aucun de ces caractéristiques sont spécifiques à bashne proviennent-ils en bash ( {1..1000}provient zsh, for n in...; doneet des variables provient de la Bourne shell, $(...), $((...))et $RANDOM viennent ksh). Les fonctionnalités qui ne sont pas POSIX sont {1..1000}, $RANDOMet /dev/urandom.
Stéphane Chazelas

1
Si vous vouliez que 1..1000 soit de largeur constante, vous avez besoin "%04d"dans ce cas bashou zshpouvez le faire {0001..1000}sansprintf
dave_thompson_085

Fonctionnalité supplémentaire: j'ai besoin d'un moyen de répartir ces fichiers sur de nombreux sous-répertoires imbriqués nommés de manière aléatoire.
stu

10

Une variante avec seq, xargs, ddet shuf:

seq -w 1 10 | xargs -n1 -I% sh -c 'dd if=/dev/urandom of=file.% bs=$(shuf -i1-10 -n1) count=1024'

Explication demandée par commentaires:

seq -w 1 10imprime une séquence de chiffres de 01 à 10

xargs -n1 -I%exécute la commande sh -c 'dd ... % ...'pour chaque numéro de séquence en remplaçant le % par lui

dd if=/dev/urandom of=file.% bs=$(shuf ...) count=1024crée les fichiers alimentés à partir de / dev / urandom avec 1024 blocs avec une taille de bloc de

shuf -i1-10 -n1une valeur aléatoire de 1 à 10


Qu'est-ce que cela fait exactement?
saruftw

1
@ explication de saru95 ajoutée.
FloHimself

Cela crée 10 fichiers de taille aléatoire. Remplacez «10» par le nombre de fichiers souhaités.
Nay

2

Vous pouvez faire quelque chose comme ça:

#!/bin/bash
filecount=0
while [ $filecount -lt 10000 ] ; do
    filesize=$RANDOM
    filesize=$(($filesize+1024))
    base64 /dev/urandom | 
    head -c "$filesize" > /tmp/file${filecount}.$RANDOM
    ((filecount++))
done

J'ai essayé de faire ça mais je n'ai pas travaillé. Vous voudrez peut-être expliquer les paramètres. :)
João José

thx très rapide @rahul
BG Bruno

2

Cela utilise un seul pipeline et semble assez rapide, mais a la limitation que tous les fichiers sont de la même taille

dd if=/dev/urandom bs=1024 count=10240 | split -a 4 -b 1k - file.

Explication: Utilisez dd pour créer 10240 * 1024 octets de données; divisez cela en 10240 fichiers séparés de 1k chacun (les noms s'exécuteront de 'file.aaaa' à 'file.zzzz')

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.