Classificando arquivos por nome de arquivo

0

Estou tentando classificar meus arquivos por padrão em filename, criando o Linux Script (Bash).

Meus arquivos são principalmente .JPG, alguns .AV e .MP4. Não consigo usar metatags, porque esses arquivos têm tags quebradas (restauradas da falha de RAID).

A maioria dos meus arquivos tem uma tag como esta Seaxxx_A01_xxx.jpg ou Beach_xxx_A01A02_xxx.jpg ou Mountain_xxx_A04A12_xxx.jpg (essa é a minha referência para quem tirou fotos e dispositivos, por exemplo, câmera, reflexo, etc ...).

Minha necessidade é colocar o arquivo na pasta e subpasta corretas, com base no nome do arquivo.

Acho que você pode realizar 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 é encontrado, procure pela primeira parte do nome do arquivo (ou seja, mar, praia, montanha, família, etc ..., sempre colocado como as primeiras palavras, normalmente eu não tenho nada antes) e use a primeira parte para procurar uma pasta com um nome similar e colocá-la (se meu arquivo contiver: Sea_Royan_xxx_A04A10_xxx.jpg e eu tiver apenas uma pasta chamada "Sea", ela deve ser colocada em).

Em cada pasta, as subpastas são presentes, como A01, A02, A03, A04 ou Dio, Sandy, Mael, etc ... e eu quero o arquivo encontrado atual (ou seja, o mesmo usado para colocar na pasta pai , Mar, montanha, etc ...) ser verificado para o segundo padrão listado acima ser usado para colocar na subpasta correta.

Na verdade, e mais facilmente eu preciso: Procure arquivos, quando encontrados, verifique o nome do arquivo e use dois padrões para movê-lo na pasta e nas subpastas corretas.

Deixe-me saber como posso fazer isso (eu sei como procurar por arquivos, baseado em padrão, mas não como ler o nome do arquivo encontrado atual e neste nome de arquivo verificar se há dois padrões a serem usados como PATH correto), tem uma maneira mais fácil ou melhor maneira de fazer isso, fique à vontade para me avisar!

    
por Dio 27.09.2016 / 13:24

1 resposta

0

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.

    
por 28.09.2016 / 21:06