2010-01-18 19 views
9

Me gustaría crear más de 1000 archivos de texto con texto para probar una secuencia de comandos, cómo crear esto mucho si los archivos de texto de una vez usan script de shell o Perl. Por favor alguien podría ayudarme.¿Cómo puedo crear 1000 archivos que puedo usar para probar un script?

+0

¿Puedes crear un archivo de texto? ¿Puede diseñar un esquema para generar nombres de archivos, por ej. file0001, file002? ¿Puedes escribir un ciclo for para hacer esas dos tareas? ¿En qué punto te quedas atascado? – djna

Respuesta

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

o si desea utilizar Python 2.6 <

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

Los nombres de tus archivos en la versión de Bash serán del 10 al 1000999. Creo que te refieres a 'echo' algún texto '> archivo $ archivo' –

+0

sí, eso es para detectar. – ghostdog74

+0

La primera opción requiere Bash 4 para hacer uso del relleno. En versiones anteriores, puede especificar ceros a la izquierda, pero no aparecerán en el resultado. –

1

no sé en shell o Perl, pero en Python sería:

#!/usr/bin/python 

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

Creo que es bastante sencillo lo que hace.

+0

He intentado su secuencia de comandos, pero me aparece un error: ./crea.py:4: Advertencia: 'con' se convertirá en una palabra clave reservada en Python 2.6 Archivo "./crea.py", línea 4 con open ('archivo% 0.3d'% i, 'w') como fd: ^ SyntaxError: sintaxis no válida – Kaartz

+0

try from __future__ import with_statement – ghostdog74

+2

Eso sería 'desde __future__ import with_statement' (el sistema comió los guiones bajos en * * ** comentario de ghostdog74). –

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

anterior creará 1.000 archivos con cada archivo que tiene un número de 1 a 1000. Los archivos se nombrarán 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

Sólo se puede utilizar sin Bash externos y aún así ser capaz de rellenar los números para los nombres de archivo tipo p roperly (si es necesario):

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 puede hacerlo de esta manera:

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

Ambas versiones producen nombres de archivo como "file0001" y "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; 
} 

¿Por qué las 2 primeras líneas? Debido a que son una buena práctica, los uso incluso en programas de una oportunidad como estos.

Saludos, Oferta

+1

Mientras defiende las buenas prácticas (y con razón), también puede verificar el éxito en abierto ... o morir "no se puede abrir el archivo: $!"; – toolic

+1

... o podría simplemente 'usar autodie;' –

3

Para variar:

#!/usr/bin/perl 

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

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

Esto es asombroso. Me reí de su simplicidad por un buen minuto. Upvoted. – Samveen

0

Aquí es un programa Perl corto de línea de comandos.

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

1

acaba de tomar cualquier archivo grande que tiene más de 1000 bytes (para 1000 archivos con contenido). Hay muchos de ellos en su computadora. A continuación, realice (por ejemplo):

split -n 1000 /usr/bin/firefox 

Esto es instantáneamente rápido.

o un archivo más grande:

split -n 10000 /usr/bin/cat 

Esto tomó sólo 0,253 segundos para la creación de 10.000 archivos.

Para 100k archivos:

split -n 100000 /usr/bin/gcc 

Sólo 1.974 segundos de 100 mil archivos con cerca de 5 bytes cada uno.

Si solo desea archivos con el texto, mire su directorio/etc. Crear un millón de archivos de texto con casi aleatoria texto:

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

20.203 segundos para archivos 1M con cerca de 2 bytes cada uno. Si divide este archivo grande en solo 10k partes, solo toma 0.220 segundos y cada archivo tiene 256 bytes de texto.

+0

La única objeción puede ser 'los archivos no serán archivos de texto'. Tengo una versión arcaica de GNU 'split' que no reconoce' -n'; la versión de BSD (Mac OS X) tampoco lo reconoce. Solo necesito actualizar mi instalación de CoreUtils. –

+0

Ok, eso es cierto. Si desea un millón de archivos de texto pequeños, simplemente use un archivo de texto grande como entrada. Hay suficiente en tu computadora. Por ejemplo /etc/gconf/schemas/gnome-terminal.schemas que tiene 2.6 MB si quieres uno muy grande. – erik

Cuestiones relacionadas