Aqui está uma abordagem possível, que provavelmente não é a mais bonita nem a mais original. A idéia é usar expressões regulares no awk para extrair os bits relevantes dos nomes dos arquivos. Então nós seguimos em frente para construir o comando shell move (mv) no awk. Finalmente, usamos o comando do sistema disponível no awk para executar o comando e mover os arquivos para as subpastas adequadas.
Tente isso primeiro para obter uma descrição detalhada:
find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2]; cmd=("mv " "" filename " " folder "/" subfolder); print "Command to be run: ", cmd }'
Resultado:
Command to be run: mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run: mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run: mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02
Para realmente executar o comando, você adiciona system (cmd) ao final da instrução:
find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2]; cmd=("mv " "" filename " " folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'
A única coisa que você provavelmente desejará é ajustar o regex às suas necessidades. Estou supondo que você esteja familiarizado com o regex, aqui estamos capturando duas partes dos nomes dos arquivos. Os grupos de captura estão entre parênteses.
A partir do início do nome do arquivo, pegamos tudo que não está sublinhado, até encontrarmos um sublinhado. Então continuamos procurando até encontrarmos o padrão A #####, onde # representa letras / dígitos (o segundo grupo de captura). Nós capturamos até atingirmos o próximo sublinhado.