La méthode bash
est bonne, mais que se passe-t-il si vous travaillez avec un shell qui ne prend pas en charge l'expansion de l'accolade ? touch file{1..10}
ne fonctionne pas pour moi sur mksh
par exemple. Voici trois façons alternatives qui fonctionnent indépendamment du shell.
seq
Une approche plus neutre en shell serait de combiner la commande seq
pour générer une séquence de nombres formatés avec les options de printf
, et de la passer à la commande xargs
. 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 sûr, Perl, étant un outil *nix assez répandu, peut également le faire. La commande spécifique en 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
Effectivement, ce qui se passe ici est que nous spécifions 3 arguments en ligne de commande : préfixe de nom de fichier, index de départ et index de fin. Ensuite, nous utilisons do { } for $ARGV[1] .. $ARGV[2]
pour itérer sur une plage spécifique de nombres. Disons que $ARGV[1]
était 5 et $ARGV[2]
était 9, nous itérerions sur 5,6,7,8 et 9.
Ce qui se passe à chaque itération entre les accolades ? nous prenons chaque nombre spécifié avec $_
, et en utilisant la fonction sprintf()
, nous créons une chaîne qui assemble le préfixe (premier argument de ligne de commande, $ARGV[0]
) et le nombre donné, mais en remplissant le nombre de 4 zéros (ce qui est fait par le formatage de type printf
, partie %04d
), et nous ajoutons le suffixe .c
. Résultat : à chaque itération, nous créons un nom comme bspl0001.c
.
L'opération open(my $fh, ">", $var);close($fh)
agit efficacement comme la commande touch
, créant un fichier avec le nom spécifié.
Un peu long mais cela fonctionne assez bien, de manière similaire au script python de Jacob Vlijm. Il peut également être converti en un script pour plus de lisibilité si nécessaire, comme suit :
#!/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 "Impossible d'ouvrir " . $var ;
close($fh) or die "Impossible de fermer " . $var ;
}
Testons ceci. D'abord la commande en une ligne :
$ 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 serait d'utiliser awk
, en exécutant une boucle for, redirigeant vers un fichier spécifique. L'approche est similaire à celle du perl en une ligne avec des arguments en ligne de commande. Bien que awk
soit principalement un utilitaire de traitement de texte, il peut tout de même réaliser des programmations système intéressantes.
$ 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