Primeiro, colete a lista de nomes de imagens:
ls *jpg | gawk -F_ '{print $2}' | sort | uniq
Agora, passe-os por montage
:
ls *jpg | gawk -F_ '{print $2}' | sort | uniq |
while read n; do montage *\_$n\_* IMAGE_$n.jpg; done
Isso pressupõe que seus nomes de arquivos não contenham espaços ou outros caracteres estranhos. Não tenho certeza sobre o seu caso "ideal". Se você atualizar sua pergunta para mostrar sua saída "ideal", eu posso trabalhar em algo para você.
Atualização:
Isso eu escrevi um pequeno script Perl deve fazer o que você precisa:
#!/usr/bin/env perl
my %k; ## declare the hash that will store the image names
while(<>){ ## loop through STDIN
chomp; ## remove newline (\n)
@a=split(/_/); ## split the line on '_' and save as array @a
###################################################
# Since the image names can have varying numbers #
# of "_", we want to use the penultimate item in #
# the array ($a[$#a-1]) as the image name prefix #
###################################################
$a[$#a-1]=~s/\d*//g;
#############################################################
# Now that we have the prefix ('A' or 'B' in your example), #
# we will save this image name in the hash of that prefix #
#############################################################
$k{$a[$#a-1]}{$_}=1;
}
## The keys of the hash '%k' are all the prefixes we have found
foreach my $prefix (keys(%k)){
@images=keys(%{$k{$prefix}}); ## all the images with this prefix
## Print the montage command to be executed (testing)
print "montage @images -title $prefix -tile 4x $prefix.jpg\n";
##############################################################
# If the commands printed above are correct, uncomment this #
# line to execute them instead of only printing. #
##############################################################
#'montage @images -title $prefix -tile 4x $prefix.jpg'
}
Você pode salvá-lo como foo.pl
ou o que você preferir e executá-lo assim:
ls *jpg | perl foo.pl
Ou você pode executá-lo como um folheto:
ls *jpg | perl -e 'my %k; while(<>){chomp; @a=split(/_/); $a[$#a-1]=~s/\d*//g; $k{$a[$#a-1]}{$_}=1;} foreach my $prefix (keys(%k)){@images=keys(%{$k{$prefix}}); 'montage @images -title $prefix -tile 4x $prefix.jpg';}'
IMPORTANTE : Este script é muito simples e não funcionará se os nomes dos arquivos contiverem espaços ou outros caracteres estranhos. Estou assumindo que isso não é um problema para você, é relativamente fácil de corrigir, mas torna a sintaxe mais complexa ao redor.