gera uma lista de arquivos com base em um padrão de tempo no nome do arquivo

0

Eu tenho um dispositivo de gravação de câmera que gerará uma pasta estruturada com vídeos como este abaixo.

Eu quero gerar uma lista de arquivos de vídeos, mas apenas aqueles em um determinado intervalo de tempo. Por exemplo: entre as 8h00 e as 17h00 (os vídeos fora desta faixa têm uma qualidade ruim devido à pouca luz)

o nome do arquivo é estruturado assim: [DATE Folder] AM | PM / sricam- [data] - [time] -sequence # .mp4

com o exemplo a seguir, o filtro listaria apenas o arquivo a partir das 8h08: 15

/data/20171229AM/sricam-20171229-070814-1514520494.mp4
/data/20171229AM/sricam-20171229-073814-1514522294.mp4
/data/20171229AM/sricam-20171229-080815-1514524095.mp4
/data/20171229PM/sricam-20171229-180815-1513553225.mp4

achei que o padrão de expansão da chave pode filtrar os números, mas como fazer isso em todas as subpastas

espero que minhas explicações não sejam muito confusas:)

Obrigado

    
por Max 27.02.2018 / 23:02

3 respostas

1

Depois de algumas tentativas & erro eu achei awk sendo mais apropriado para fazer tal filtragem

eu cheguei a esta solução de uma linha:

find $PWD -name "*.mp4" |  awk  -F- '{ if ( substr($3,1,2) <= "17" &&  substr($3,1,2) >= "08")  print $0 }'

mas deixe-me explicar:

find $PWD -name "*.mp4"   ## find all videos and print full path


awk -F-                   ## tels awk that the separator is dash character : -

agora meu exemplo de caminho de saída será dividido em 4 "colunas" (contagem de 3 traços) e cada coluna é acessada através de $ n

Portanto, a coluna interessante aqui é $ 3 porque contém o tempo

$0 = /data/20171229AM/sricam-20171229-070814-1514520494.mp4

$1 = /data/20171229AM/sricam

$2 = 20171229

$3 = 070814

$4 = 514520494.mp4

temos que fazer uma filtragem de condição: se a hora estiver entre 08 e 17, imprima a linha.

substr($3,1,2)          ## take the two first chars from $3 column starting at position 1

substr($3,1,2) <= "17"

Note the quotes around 17 , this means "convert to string" -- without it, the two conditions in the if statement would never be true

print $0        ##   print the whole line (without the splitting)

Obrigado a todos por todas as suas sugestões.

    
por 04.03.2018 / 18:38
0

A menos que eu tenha entendido mal o que você está perguntando, você pode combinar caracteres curinga da maneira que quiser, incluindo correspondência em subdiretórios. Então, isso deve fazer o que você quer: (Eu não testei eu mesmo, no entanto)

/data/*/sricam-*-{08,09,10,11,12,13,14,15,16,17}????-*.mp4

Não ficou claro se você queria excluir os vídeos a partir das 17:00. Se você precisa incluir 17:00:00, mas exclua qualquer coisa depois disso (digamos), você pode até combinar várias expressões curinga:

/data/*/sricam-*-{08,09,10,11,12,13,14,15,16}????-*.mp4 /data/*/sricam-*-170000-*.mp4

(observe o espaço entre as expressões).

    
por 28.02.2018 / 08:32
0

Os curingas de Bash irão resolver isto trivialmente. Qualquer comando que permita passar vários argumentos do nome do arquivo também permitirá que você passe em vários curingas.

printf '%s\n' 20171229AM/sricam-20171229-0[89]*.mp4 20171229AM/sricam-20171229-1[01]*.mp4 20171229PM/sricam-20171229-1[2-6]*.mp4

Você pode usar os mesmos argumentos que o driver para um loop:

for file in 20171229AM/sricam-20171229-0[89]*.mp4 20171229AM/sricam-20171229-1[01].mp4 20171229PM/sricam-20171229-1[2-6]*.mp4; do
    : things with "$file"
done

Talvez seja interessante ressaltar que o shell (Bash, ou o que você estiver usando) expandirá os curingas para uma lista de arquivos correspondentes antes que qualquer comando seja executado. (Quando não há correspondências, os curingas serão passados na íntegra, embora você possa especificar a opção nullglob para que simplesmente desapareça neste caso.)

Estes são padrões "glob", não expressões regulares. Bash tem uma facilidade de globbing estendida que é mais próxima da regex, mas ainda não é exatamente regex; mas isso não é necessário para esta tarefa simples.

    
por 28.02.2018 / 09:26