Isso parece um pouco complicado demais para Bash ser honesto. Não é impossível, mas na minha opinião, você está muito melhor usando uma linguagem feita para programação "real" aqui. Uma solução de Bash provavelmente será inatingível. (Não estou tentando insultar a solução Bash-only, acho que a magia renomear é bem incrível, na verdade)
Dito isso, aqui está uma solução com o Ruby. Você pode escrevê-lo em um arquivo e depois executar o arquivo de dentro do seu shell, já que você tem o Ruby instalado.
#!/usr/bin/env ruby
Dir.glob('*.jpg').each do |filename|
# 'name' contains the name of the file, without the tags. 'tags' is an array
# of all tags of the file.
name, *tags = filename.split(' #')
# if there aren't any tags, just skip the file.
if tags.empty?
next
end
# remove the trailing '.jpg' and sort all the tags
tags.last.gsub!(/\.jpg$/,'')
tags.sort!
tags = [name] + tags
# finally, move the file to the correct location with sorted tags.
File.rename filename, "#{tags.join(' #')}.jpg"
end
Para executar o script, basta colocá-lo no diretório em que suas imagens estão. Essa solução deve ser bastante resiliente a nomes de imagem e tags bobos, como C#
não causará problemas. Dito isso, certifique-se de fazer um backup antes de executar o script. Operações de movimento podem ser tão destrutivas quanto um rm
.