O bash
way é 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 em mksh
, por exemplo. Aqui estão três maneiras alternativas que funcionam independentemente do shell.
seq
Uma abordagem mais neutra do shell seria combinar o comando seq
para gerar a sequência de números formatados com printf
options e passá-lo ao comando xargs
. 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
É claro que o Perl, sendo uma ferramenta widespred * nix, também pode fazer isso. O comando de uma linha específica 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 3 argumentos de linha de comando: prefixo de nome de arquivo, índice inicial e índice final. Em seguida, usamos do { } for $ARGV[1] .. $ARGV[2]
para iterar para um intervalo específico de números. Digamos, $ARGV[1]
foi 5 e $ARGV[2]
foi 9, nós iteraríamos acima de 5,6,7,8 e 9.
O que acontece em cada iteração dentro das chaves? tomamos cada número especificado com $_
, e usando sprintf()
function criamos uma string m que emende o prefixo (primeiro argumento de linha de comando, $ARGV[0]
) e o número dado, mas preenche o número com 4 zeros ( que é feito por printf
-style de formatação, %04d
part) e anexe o sufixo .c
. Como resultado em cada iteração, criamos um nome como bspl0001.c
.
O open(my $fh, ">", $var);close($fh)
atua efetivamente como touch
, criando um arquivo com o nome especificado.
Apesar de um pouco longo, ele funciona muito bem, de forma semelhante ao script python de Jacob Vlijm. Ele também pode ser convertido em um script para legibilidade, se desejado, da seguinte forma:
#!/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 com awk
, executando um loop for, redirecionando para um arquivo específico. A abordagem é semelhante ao perl one-liner com argumentos de linha de comando. Enquanto awk
é principalmente um utilitário de processamento de texto, ainda pode fazer alguma programação de sistema legal.
$ 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