Estou tentando classificar meus arquivos por padrão em nome de arquivo criando Linux Script (Bash).
Meus arquivos são principalmente .JPG, alguns .AV e .MP4. Não posso usar meta tags, porque esses arquivos possuem tags quebradas (restauradas de falha de RAID).
A maioria dos meus arquivos estão com tags como esta Seaxxx_A01_xxx.jpg ou Beach_xxx_A01A02_xxx.jpg ou Mountain_xxx_A04A12_xxx.jpg (esta é minha referência para quem tirou fotos e dispositivo, ou seja: câmera, reflex, etc ...).
Minha necessidade é colocar o arquivo na pasta e subpasta corretas, com base no nome do arquivo.
Acho que consegui essa tarefa assim:
use find, procure o padrão [AZ][0-2][0-6] ou [AZ][0-2][0-6][AZ][0-2][0-6], quando este padrão for encontrado, procure a primeira parte do nome do arquivo, (ou seja, Mar, praia, montanha, família, etc..., sempre colocada como as primeiras palavras, normalmente não tenho mais nada antes) e use a primeira parte para procurar uma pasta com um nome semelhante e coloque-a (se meu arquivo contiver: Sea_Royan_xxx_A04A10_xxx.jpg e eu tiver apenas uma pasta chamada "Sea" ela deverá ser colocada).
Em cada pasta estão presentes subpastas, como A01, A02, A03, A04 ou Dio, Sandy, Mael, etc ... e eu quero o arquivo encontrado no momento (ou seja, o mesmo usado para colocar na pasta pai, Sea, montanha, etc...) seja verificado para que o segundo padrão listado acima seja usado para colocar na subpasta correta.
Na verdade e mais simplesmente eu preciso: Procure os arquivos, quando encontrados, verifique o nome do arquivo e use dois padrões para movê-lo para a pasta e subpastas corretas.
Deixe-me saber como posso fazer isso (eu sei como procurar arquivos, com base no padrão, mas não como ler o nome do arquivo encontrado atualmente e neste nome de arquivo verificar se há dois padrões para serem usados como PATH correto), se você tiver mais maneira mais fácil ou melhor de fazer isso, sinta-se à vontade para me avisar!
Responder1
Aqui está uma abordagem possível, que provavelmente não é a mais bonita nem a mais original. A ideia é usar expressões regulares no awk para extrair os bits relevantes dos nomes dos arquivos. Em seguida, passamos a 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 apropriadas.
Tente isto 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) no 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. Presumo que você esteja familiarizado com regex. Aqui estamos capturando duas partes dos nomes dos arquivos. Os grupos de captura estão entre parênteses.
Começando do início do nome do arquivo, pegamos tudo que não é sublinhado, até encontrarmos um sublinhado. Então continuamos procurando até encontrar o padrão A#####, onde # representa letras/dígitos (o segundo grupo de captura). Capturamos até atingirmos o próximo sublinhado.