2010-01-18 3 views
9

Je voudrais créer plus de 1000 fichiers texte avec du texte pour tester un script, comment créer autant de fichiers texte à la volée en utilisant shell script ou Perl. S'il vous plaît quelqu'un pourrait-il m'aider.Comment puis-je créer 1000 fichiers que je peux utiliser pour tester un script?

+0

Pouvez-vous créer un fichier texte? Pouvez-vous concevoir un système pour générer des noms de fichiers, par exemple. fichier0001, fichier002? Pouvez-vous écrire une boucle for pour faire ces deux tâches. À quel moment êtes-vous coincé? – djna

Répondre

8
for i in {0001..1000} 
do 
    echo "some text" > "file_${i}.txt" 
done 

ou si vous voulez utiliser Python 2.6 <

for x in range(1000): 
    open("file%03d.txt" % x,"w").write("some text") 
+0

Vos noms de fichiers dans la version Bash sera de 10 à 1000999. Je pense que vous voulez dire 'echo" du texte "> fichier $ fichier' –

+0

oui, merci de repérer. – ghostdog74

+0

La première option nécessite que Bash 4 utilise le remplissage. Dans les versions antérieures, vous pouvez spécifier des zéros en tête, mais ils n'apparaîtront pas dans le résultat. –

1

Je ne sais pas décortiqués perl mais en python serait:

#!/usr/bin/python 

for i in xrange(1000): 
    with open('file%0.3d' %i,'w') as fd: 
     fd.write('some text') 

Je pense est assez simple ce qu'il fait.

+0

J'ai essayé votre script, mais j'obtiens une erreur: ./crea.py:4: Attention: 'avec' deviendra un mot-clé réservé en Python 2.6 Fichier "./crea.py", ligne 4 avec open ('fichier% 0.3d'% i, 'w') comme fd: ^ SyntaxError: syntaxe invalide – Kaartz

+0

try from __future__ import with_statement – ghostdog74

+2

Ce serait 'from __future__ import with_statement' (le système a mangé les underscores dans * * commentaire de ghostdog74 **). –

6
#!/bin/bash 
seq 1 1000 | split -l 1 -a 3 -d - file 

Au-dessus va créer 1000 fichiers avec chaque fichier ayant un nombre de 1 à 1000. Les fichiers seront nommés file000 ... file999

2
#!/bin/bash 

for suf in $(seq -w 1000) 
do 
     cat <<EOF> myfile.$suf 
     this is my text file 
     there are many like it 
     but this one is mine. 
EOF 
done 
1

Vous ne pouvez utiliser que Bash et sans externals être encore capable de rembourrer les nombres de sorte que le p sorte les noms de fichiers roperly (si nécessaire):

read -r -d '' text << 'EOF' 
Some text for 
my files 
EOF 

for i in {1..1000} 
do 
    printf -v filename "file%04d" "$i" 
    echo "$text" > "$filename" 
done 

Bash 4 peut le faire comme ceci:

for filename in file{0001..1000}; do echo $text > $filename; done 

Les deux versions produisent des noms comme "file0001" et "file1000".

4

En Perl:

use strict; 
use warnings; 

for my $i (1..1000) { 
    open(my $out,">",sprintf("file%04d",$i)); 
    print $out "some text\n"; 
    close $out; 
} 

Pourquoi les 2 premières lignes? Parce qu'ils sont de bonnes pratiques, je les utilise même dans des programmes à 1 tir comme ceux-ci.

Cordialement, offre

+1

Alors que vous préconisez les bonnes pratiques (et à juste titre), vous pouvez aussi bien vérifier le succès à l'ouverture ... ou mourir "impossible d'ouvrir le fichier: $!"; – toolic

+1

... ou vous pourriez simplement 'utiliser autodie;' –

3

Pour la variété:

#!/usr/bin/perl 

use strict; use warnings; 
use File::Slurp; 

write_file $_, "$_\n" for map sprintf('file%04d.txt', $_), 1 .. 1000; 
+1

Ceci est génial. Je me suis moqué de sa simplicité pendant une bonne minute. Upvoted. – Samveen

0

Voici un programme Perl court de ligne de commande.

perl -E'say $_ $_ for grep {open $_, ">f$_"} 1..1000' 

1

Il suffit de prendre tout grand dossier qui a plus de 1000 octets (pour 1000 fichiers avec le contenu). Il y en a beaucoup sur votre ordinateur. Ensuite, faites (par exemple):

split -n 1000 /usr/bin/firefox 

Ceci est instantanément rapide.

Ou un fichier plus grand:

split -n 10000 /usr/bin/cat 

Cela a pris seulement 0,253 secondes pour créer 10000 fichiers.

Pour 100k fichiers:

split -n 100000 /usr/bin/gcc 

seulement 1,974 secondes pour 100k fichiers avec environ 5 octets chacun.

Si vous voulez uniquement des fichiers avec le texte, regardez dans votre répertoire/etc. Créer un million de fichiers texte avec presque aléatoire texte:

split -n 1000000 /etc/gconf/schemas/gnome-terminal.schemas 

20.203 secondes pour les fichiers 1M avec environ 2 octets chacun. Si vous divisez ce gros fichier en seulement 10k parties, cela ne prend que 0.220 secondes et chaque fichier a 256 octets de texte.

+0

Le seul problème peut être "les fichiers ne seront pas des fichiers texte". J'ai une version archaïque de GNU 'split' qui ne reconnaît pas' -n'; la version BSD (Mac OS X) ne le reconnaît pas non plus. J'ai juste besoin de mettre à jour mon installation CoreUtils. –

+0

Ok, c'est vrai. Si vous voulez un million de petits fichiers texte, utilisez simplement un gros fichier texte en entrée. Il y en a assez sur votre ordinateur. Par exemple /etc/gconf/schemas/gnome-terminal.schemas qui a 2,6 Mo si vous voulez un très gros. – erik

Questions connexes