La bash
strada è buona, ma cosa succede se stai lavorando con una shell che non supporta l'espansione di parentesi graffe? touch file{1..10}
non funziona per me, mksh
per esempio. Ecco tre modi alternativi che funzionano indipendentemente dalla shell.
ss
Un approccio più neutro alla shell sarebbe quello di combinare il seq
comando per generare una sequenza di numeri formattati con le printf
opzioni e passarlo al xargs
comando. Per esempio,
$ 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
Ovviamente, Perl, essendo uno strumento abbastanza diffuso * nix, può fare altrettanto. Il comando specifico one-liner che abbiamo qui è il seguente:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
In effetti ciò che accade qui è che specifichiamo 3 argomenti della riga di comando: prefisso del nome file, indice iniziale e indice finale. Quindi usiamo do { } for $ARGV[1] .. $ARGV[2]
per iterare per un intervallo specifico di numeri. Diciamo, $ARGV[1]
aveva 5 anni e $ARGV[2]
9, ripetevamo oltre 5,6,7,8 e 9.
Cosa succede ad ogni iterazione all'interno delle parentesi graffe? prendiamo ogni numero specificato con $_
, e usando la sprintf()
funzione creiamo una stringa m che unisce il prefisso (primo argomento della riga di comando $ARGV[0]
) e il numero dato, ma riempiendo il numero con 4 zeri (che è fatto dallo printf
stile di formattazione, %04d
parte) e allegare il .c
suffisso. Come risultato di ogni iterazione, creiamo un nome come bspl0001.c
.
La open(my $fh, ">", $var);close($fh)
agisce effettivamente come touch
comando, la creazione di un file con nome specificato.
Sebbene leggermente lungo, si comporta abbastanza bene, in modo simile alla sceneggiatura in pitone di Jacob Vlijm. Se lo si desidera, può anche essere convertito in uno script per essere leggibile, in questo modo:
#!/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 ;
}
Proviamo questo. Innanzitutto il 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 ora la sceneggiatura:
$ 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
Un altro approccio sarebbe con awk
, eseguendo un ciclo for, reindirizzando a un file specifico. L'approccio è simile al perl one-liner con argomenti da riga di comando. Mentre awk
è principalmente un'utilità di elaborazione del testo, può ancora fare una buona programmazione 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