con ese archivo quiero hacer muchas cosas.
¿Es un requisito indispensable que este archivo sea el punto inicial? Digo, porque el programa bien puede llamar a vanitygen por su cuenta y así no te molestas tú

. Pero si el programa llama a vanitygen por su cuenta, entonces hace falta especificar el número de direcciones que queremos, o de lo contrario vanitygen no terminará nunca. ¿Te sirven estos cambios?
Bueno, más que especificar el número de direcciones, tiene más sentido especificar el número de carpetas, y ya te las genera enteras con los 24 elementos dentro de cada una.
Otra cosa, ¿qué parámetros quieres para qrencode?
Si este diálogo va fluido, hoy lo tienes hecho.
Lo siento, no me he podido resistir

. Edita estos dos "my" de aquí arriba de todo para usar tu vanitygen con tus parámetros, y tu qrencode con tus parámetros.
#!/usr/bin/perl
use warnings;
use strict;
use File::Spec;
use Errno qw/EEXIST/;
use Getopt::Long;
my $vanitygen_cmd = '/path/to/vanitygen-0.10 -i -k -q 1bar';
my $qrencode_cmd = 'qrencode';
sub new_elem {
my ($fd) = @_;
my @lines;
for (1..3) {
my $line = <$fd>;
if (!defined $line) {
warn "read: $!";
return;
}
$line =~ s/^[^:]+:/;
chomp $line;
push @lines, $line;
}
return @lines;
}
sub _mkdir {
my ($dir) = @_;
if (!mkdir $dir) {
return 1 if EEXIST == $!;
warn "mkdir: '$dir': $!";
return;
}
return 1;
}
## vg000/00/0
## vg000/00/1
## vg000/01/0
## vg000/01/1
## vg000/02/0
## vg000/02/1
## [...]
## vg000/11/0
## vg000/11/1
## vg001/00/0
## vg001/00/1
sub create_dir {
my ($idx) = @_;
my $level3 = int ($idx%2);
my $level2 = sprintf '%02d', int (($idx/2)%12);
my $level1 = sprintf 'vg%03d', int ($idx/24);
my $level2full = File::Spec->catfile ($level1, $level2);
my $level3full = File::Spec->catfile ($level1, $level2, $level3);
_mkdir $level1 or return;
_mkdir $level2full or return;
_mkdir $level3full or return;
return $level3full;
}
GetOptions \my %opts, '--num-dirs=i', '--verbose' or die "usage: $0 [ --num-dirs N ] [ --verbose ]\n";
$opts{'num-dirs'} ||= 1;
my $limit = 24*$opts{'num-dirs'};
my $pid = open my $fd, "$vanitygen_cmd|" or die "fork/exec: $!";
my $idx = 0;
while (1) {
my ($pat, $addr, $privk) = new_elem $fd or last;
my $dir = create_dir $idx or last;
$opts{'verbose'} and printf "pat ($pat) addr ($addr) privk ($privk) idx ($idx) dir ($dir)\n";
system "$qrencode_cmd -o $dir/addr.png $addr";
system "$qrencode_cmd -o $dir/privkey.png $privk";
last if $limit <= ++$idx;
}
kill 'TERM', $pid;
close $fd;
Ejemplos:
$ ./qr-choco-gen.pl --num-dirs 4 --verbose
$ ./qr-choco-gen.pl -n 4 -v ## equivalente
$ ./qr-choco-gen.pl -n 100
Los directorios no son exactamente los especificados, sino:
vg000/00/0/privkey.png
vg000/00/0/addr.png
vg000/00/1/privkey.png
vg000/00/1/addr.png
vg000/01/0/privkey.png
vg000/01/0/addr.png
vg000/01/1/privkey.png
vg000/01/1/addr.png
[...]
vg000/11/0/privkey.png
vg000/11/0/addr.png
vg000/11/1/privkey.png
vg000/11/1/addr.png
vg001/00/0/privkey.png
vg001/00/0/addr.png
vg001/00/1/privkey.png
vg001/00/1/addr.png
Si tus requisitos son inflexibles, pégame un codazo y lo cambio. La motivación de esto es que empezando en 0 me es más fácil

y que teniendo siempre el mismo número de dígitos el resultado te aparece automáticamente ordenado en el directorio, en lugar de:
0
1
10
11
2
3
[...]
Le he puesto 3 cifras al primer nivel de directorios; si necesitas más, se cambia fácilmente. Busca "03" en el script, y lo cambias ahí.