O bash
caminho é bom, mas e se você estiver trabalhando com um shell que não suporta a expansão de chaves? touch file{1..10}
não funciona para mim, mksh
por exemplo. Aqui estão três maneiras alternativas que funcionam independentemente do shell.
seq
Uma abordagem mais neutra ao shell seria combinar o seq
comando para gerar a sequência de números formatados com as printf
opções e passá-lo ao xargs
comando. Por exemplo,
$ 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
Obviamente, o Perl, sendo uma ferramenta * nix bastante difundida, também pode fazer isso. O comando de uma linha específico que temos aqui é o seguinte:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
Efetivamente, o que acontece aqui é que especificamos três argumentos de linha de comando: prefixo do nome do arquivo, índice inicial e final. Em seguida, usamos do { } for $ARGV[1] .. $ARGV[2]
a iteração para um intervalo específico de números. Digamos, $ARGV[1]
tinha 5 e $ARGV[2]
9, iteraríamos mais de 5,6,7,8 e 9.
O que acontece em cada iteração nos chavetas? pegamos cada número especificado com $_
e, usando a sprintf()
função, criamos uma string m que emenda o prefixo (primeiro argumento da linha de comando $ARGV[0]
) e o número fornecido, mas preenche o número com 4 zeros (o que é feito pelo printf
estilo de formatação, %04d
part) e anexe o .c
sufixo. Como resultado, em cada iteração, criamos um nome como bspl0001.c
.
Ele open(my $fh, ">", $var);close($fh)
atua efetivamente como touch
comando, criando um arquivo com nome especificado.
Embora um pouco longo, ele tem um desempenho muito bom, de maneira semelhante ao script python de Jacob Vlijm. Também pode ser convertido em um script para facilitar a leitura, se desejado, da seguinte maneira:
#!/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 testar isso. Primeiro o 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
E agora o script:
$ 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
Outra abordagem seria awk
, executando um loop for, redirecionando para um arquivo específico. A abordagem é semelhante ao one-liner perl com argumentos de linha de comando. Embora awk
seja principalmente um utilitário de processamento de texto, ele ainda pode fazer uma programação interessante do 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