La bashstrada è 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, mkshper esempio. Ecco tre modi alternativi che funzionano indipendentemente dalla shell.
ss
Un approccio più neutro alla shell sarebbe quello di combinare il seqcomando per generare una sequenza di numeri formattati con le printfopzioni e passarlo al xargscomando. 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 printfstile di formattazione, %04dparte) e allegare il .csuffisso. Come risultato di ogni iterazione, creiamo un nome come bspl0001.c.
La open(my $fh, ">", $var);close($fh)agisce effettivamente come touchcomando, 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