2010-01-18 11 views
9

Ich würde gerne mehr als 1000 Textdateien mit etwas Text erstellen, um ein Skript zu testen, wie man so viel erstellt, wenn Textdateien auf einmal Shellskript oder Perl verwenden. Bitte könnte mir jemand helfen.Wie kann ich 1000 Dateien erstellen, mit denen ich ein Skript testen kann?

+0

Können Sie eine Textdatei erstellen? Können Sie ein Schema zur Generierung von Dateinamen erstellen, z. Datei0001, Datei002? Kannst du eine for-Schleife schreiben, um diese beiden Aufgaben zu erledigen? An welchem ​​Punkt bleibst du stecken? – djna

Antwort

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

oder wenn Sie wollen verwenden Python < 2.6

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

Ihre Dateinamen in der Bash-Version werden 10 bis 1000999 sein. Ich denke, Sie meinen "echo" etwas Text "> Datei $ Datei" –

+0

ja, thks für die Erkennung. – ghostdog74

+0

Die erste Option erfordert Bash 4, um die Auffüllung zu verwenden. In früheren Versionen können Sie führende Nullen angeben, diese werden jedoch nicht im Ergebnis angezeigt. –

1

Ich weiß nicht, in der Schale oder Perl aber in Python wäre:

#!/usr/bin/python 

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

Ich denke, ist ziemlich einfach, was es tut.

+0

Ich habe Ihr Skript versucht, aber ich erhalte einen Fehler: ./crea.py:4: Warnung: 'mit' wird ein reserviertes Schlüsselwort in Python 2.6 werden Datei "./crea.py", Zeile 4 mit open ('file% 0.3d'% i, 'w') als fd: ^ SyntaxError: ungültige Syntax – Kaartz

+0

probiere aus __future__ import with_statement – ghostdog74

+2

Das wäre 'from __future__ import with_statement' (das System hat die Unterstriche in * * Ghostdog74 ** Kommentar). –

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

Above wird 1000 Dateien mit jeder Datei wird file000 ... eine Zahl von 1 bis 1000. Die Dateien mit 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

Sie können ohne Äußerlichkeiten nur Bash verwenden und noch Pad Lage sein, die Zahlen, so dass die Dateinamen sortieren p roperly (falls erforderlich):

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 kann es wie folgt tun:

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

Beide Versionen produzieren Dateinamen wie "FILE0001" und "file1000".

4

In Perl:

use strict; 
use warnings; 

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

Warum die ersten zwei Zeilen? Weil sie gute Praxis sind, verwende ich sie sogar in 1-Schuss-Programmen wie diesen.

Grüße, Angebot

+1

Während Sie für gute Praktiken eintreten (und zwar zu Recht), können Sie auch auf open auf Erfolg prüfen ... oder sterben "kann Datei nicht öffnen: $!"; – toolic

+1

... oder Sie könnten einfach 'autodie verwenden;' –

3

Für Vielfalt:

#!/usr/bin/perl 

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

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

Das ist genial. Ich musste lachen über die Einfachheit für eine gute Minute. Upvoted. – Samveen

0

Hier ist ein kurzer Kommandozeilen-Perl-Programm.

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

1

nehmen Sie einfach eine große Datei, die mehr als 1000 Bytes (für 1000 Dateien mit Inhalt) hat. Es gibt viele von ihnen auf Ihrem Computer. Dann (zum Beispiel):

split -n 1000 /usr/bin/firefox 

Dies ist sofort schnell.

Oder eine größere Datei:

split -n 10000 /usr/bin/cat 

Dies geschah nur 0,253 Sekunden für 10000 Dateien.

Für 100k-Dateien:

split -n 100000 /usr/bin/gcc 

Nur 1,974 Sekunden für 100k-Dateien mit etwa 5 Byte je.

Wenn Sie nur Dateien mit Text möchten, schauen Sie in Ihrem Verzeichnis/etc nach. Erstellen Sie eine Million Textdateien mit fast zufällig Text:

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

20,203 Sekunden 1M Dateien mit etwa 2 Bytes je. Wenn Sie diese große Datei in nur 10k Teile teilen, dauert es nur 0,220 Sekunden und jede Datei hat 256 Byte Text.

+0

Die einzige Quibble kann "die Dateien werden keine Textdateien sein". Ich habe eine veraltete Version von GNU 'split', die' -n' nicht erkennt; die BSD (Mac OS X) Version erkennt es auch nicht. Ich muss nur meine CoreUtils-Installation aktualisieren. –

+0

Ok, das stimmt. Wenn Sie eine Million kleine Textdateien benötigen, verwenden Sie einfach eine große Textdatei als Eingabe. Es sind genug auf Ihrem Computer. Zum Beispiel /etc/gconf/schemas/gnome-terminal.schemas, das 2.6 MB hat, wenn Sie ein sehr großes wollen. – erik

Verwandte Themen