La bash
voie est bonne, mais que se passe-t-il si vous travaillez avec une coque qui ne supporte pas l'expansion des accolades? touch file{1..10}
ne fonctionne pas pour moi mksh
par exemple. Voici trois manières alternatives qui fonctionnent indépendamment du shell.
seq
Une approche plus neutre vis-à-vis du shell consisterait à combiner seq
commande pour générer une séquence de nombres formatés avec des printf
options et à la passer à xargs
commande. Par exemple,
$ 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
Bien entendu, Perl, en tant qu'outil assez large *, peut également le faire. La commande spécifique à une ligne que nous avons ici est la suivante:
perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5
En pratique, nous spécifions 3 arguments de ligne de commande: préfixe du nom de fichier, index de départ et index de fin. Nous utilisons ensuite do { } for $ARGV[1] .. $ARGV[2]
pour itérer une plage de nombres spécifique. Disons, $ARGV[1]
était 5 et $ARGV[2]
était 9, nous itérerions plus de 5,6,7,8 et 9.
Que se passe-t-il à chaque itération dans les accolades? nous prenons chaque nombre spécifié avec $_
, et en utilisant sprintf()
function, créez une chaîne m qui relie le préfixe (premier argument de ligne de commande $ARGV[0]
) et le nombre donné, mais en remplissant le nombre avec 4 zéros (ce qui est fait par le printf
style de formatage, %04d
partie), et fixer les .c
suffix.As un résultat à chaque itération , nous faisons un nom comme bspl0001.c
.
Le open(my $fh, ">", $var);close($fh)
agit efficacement en tant que touch
commande, créant un fichier avec le nom spécifié.
Bien que légèrement long, il fonctionne assez bien, à la manière du script python de Jacob Vlijm. Il peut aussi être converti en script pour plus de lisibilité, comme ceci:
#!/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 ;
}
Permet de tester cela. D'abord le 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
Et maintenant le 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
Une autre approche consisterait à awk
exécuter une boucle for et à rediriger vers un fichier spécifique. L'approche est similaire à celle de Perl one-line avec des arguments en ligne de commande. Bien awk
qu’il s’agisse avant tout d’un utilitaire de traitement de texte, il peut encore faire de la programmation système.
$ 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