El bash
camino es bueno, pero ¿qué pasa si está trabajando con un shell que no admite la expansión de llaves? touch file{1..10}
no funciona para mí, mksh
por ejemplo. Aquí hay tres formas alternativas que funcionan independientemente del shell.
seq
Un enfoque más neutral para la shell sería combinar el seq
comando para generar una secuencia de números formateados con printf
opciones y pasarlo al xargs
comando. Por ejemplo,
$ ls -l
total 0
$ seq -f "%04.0f" 10 | xargs -I "{}" touch bspl"{}".c
$ ls
bspl0002.c bspl0004.c bspl0006.c bspl0008.c bspl0010.c
bspl0001.c bspl0003.c bspl0005.c bspl0007.c bspl0009.c
Perl
Por supuesto, Perl, al ser una herramienta bastante amplia * nix, también puede hacerlo. El comando específico de una línea que tenemos aquí es el siguiente:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
Efectivamente, lo que sucede aquí es que especificamos 3 argumentos de línea de comandos: prefijo de nombre de archivo, índice inicial e índice final. Luego, usamos do { } for $ARGV[1] .. $ARGV[2]
para iterar para un rango específico de números. Digamos que $ARGV[1]
tenía 5 y $ARGV[2]
9, iteraríamos sobre 5,6,7,8 y 9.
¿Qué sucede en cada iteración dentro de las llaves? tomamos cada número especificado con $_
, y usando la sprintf()
función creamos una cadena m que divide el prefijo (primer argumento de la línea de comando $ARGV[0]
) y el número dado, pero completa el número con 4 ceros (que se hace por printf
estilo de formato, %04d
parte), y adjunte el .c
sufijo. Como resultado de cada iteración creamos un nombre como bspl0001.c
.
El open(my $fh, ">", $var);close($fh)
efectivamente actúa como touch
comando, creando un archivo con un nombre especificado.
Aunque es un poco largo, funciona bastante bien, de manera similar al script de python de Jacob Vlijm. También se puede convertir a un script para facilitar la lectura si lo desea, de esta manera:
#!/usr/bin/env perl
use strict;
use warnings;
for my $i ( $ARGV[1] .. $ARGV[2] ) {
my $var=sprintf("%s%04d.c",$ARGV[0],$i );
open(my $fh, ">", $var) or die "Couldn't open " . $var ;
close($fh) or die "Couldn't close " . $var ;
}
Vamos a probar esto. Primero el one-liner:
$ ls -l
total 0
$ perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
$ ls -l
total 0
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0001.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0002.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0003.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0004.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0005.c
Y ahora el guión:
$ ls -l
total 4
-rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl*
$ ./touch_range.pl bspl 1 5
$ ls -l
total 4
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0001.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0002.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0003.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0004.c
-rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0005.c
-rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl*
awk
Otro enfoque sería awk
, ejecutando un bucle for, redirigiendo a un archivo específico. El enfoque es similar al perl one-liner con argumentos de línea de comandos. Si bien awk
es principalmente una utilidad de procesamiento de texto, aún puede hacer una programación genial del sistema.
$ awk 'BEGIN{for(i=ARGV[2];i<=ARGV[3];i++){fd=sprintf("%s%04d.c",ARGV[1],i); printf "" > fd;close(fd)}}' bslp 1 5