find comando e suporte para metadados de mídia

3

Eu tenho uma pasta com vários arquivos desorganizados de todos os tipos com níveis profundos de subpastas e quero encontrar todos os arquivos de áudio com 320kpbs (taxa de bits) e executar algo em cada um deles sem movê-los todos para o mesmo local para fazer isso. Algo como:

find /some/folder -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -BITRATE_IS_320kbps -exec ... \;

Mas eu não conheço nenhuma linha de comando que possa fazer esse tipo de tarefa para mim.

Já pensei em algumas maneiras menos elegantes de conseguir isso, mas ainda quero saber como find (talvez algo parecido) arquivos por metadados como esse?

    
por Pedro Vernetti 21.12.2015 / 18:31

2 respostas

2

Usando as informações da resposta vinculada do @blm, você pode fazer algo como:

find /some/folder -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -exec bash -c " file '{}' | grep '320 kbps'" \; -exec <do what you want>

o primeiro -exec procurará apenas arquivos de 320 kbps, pois o comando file relata isso para nós. Se o grep não corresponder a nada, então -exec será falso e o segundo -exec não será executado. Se grep coincidir, então o segundo -exec será executado

Para completar, este recurso de -exec pode ser encontrado na página man

-exec command ;  
     Execute command; true if 0 status is returned

Editar:

Com relação ao uso de file nesta solução, parece não funcionar para todos. Então, aqui está uma maneira alternativa de obter a taxa de bits usando mediainfo :

#!/bin/bash

bitrate=$(mediainfo "$1" | grep -Ei 'overall bit ?rate.*[[:digit:]]+.*$' | grep -Eo [[:digit:]]+)
echo $bitrate

Você pode salvá-lo em um arquivo .sh com permissão de execução e, em seguida, ele fornecerá a taxa de bits do arquivo (somente dígitos) de acordo com mediainfo Informações gerais sobre a taxa de bits, de maneira que você possa substituir

-exec bash -c " file '{}' | grep '320 kbps'" \;

com

-exec bash -c "BITRATE_SCRIPT_PATH '{}' | grep '320'" \;

(pode se comportar mal com arquivos de áudio sem perdas, que tendem a ter 1Mbps + de taxa de bits)

    
por 21.12.2015 / 19:22
2

Não sei como você consegue obter informações de taxa de bits do file cmd, mas eu não ...

$: file 01\ -\ Trolleyed.flac
01 - Trolleyed.flac: FLAC audio bitstream data, 24 bit, stereo, 17842272 samples

$: file 01\ -\ Autumn\ Leaves.mp3
01 - Autumn Leaves.mp3: Audio file with ID3 version 2.4.0

De qualquer forma, inspirado por este post que eu criei com uma solução que requer uma ferramenta externa (neste caso, mediainfo ). Não é tão sexy ou performant que eu gostaria, mas funciona.

find . -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -exec sh -c 'for x; do export BITRATE=$(mediainfo --inform="Audio;%BitRate%" "$x"); if [ $BITRATE = 320000 ]; then echo "$x"; fi; done' _ {} +

Aqui, a instrução then simplesmente ecoa o nome do arquivo, mas pode ser substituída por qualquer outra coisa.

Merry Xmas para todos vocês ...

    
por 21.12.2015 / 22:12