Encontre e remova arquivos de áudio que tenham menos de 3 minutos de duração de reprodução

1

Existe uma maneira de encontrar e excluir todos os arquivos de áudio de forma recursiva (arquivos MP3) que tenham menos de 3 minutos de duração de reprodução?

Considere a situação em que tenho mistura de arquivos de vários formatos (por exemplo, diretórios, arquivos de texto e arquivos mp3).

    
por smc 15.10.2018 / 21:41

4 respostas

2

Aqui está um jeito. Executar mediainfo em cada arquivo mp3, se for menor que 3 minutos, exclua-o.

#!/bin/bash
for FILE in $(find . -type f -name \*.mp3); do
    [[ $(mediainfo --Output='Audio;%Duration%' "${FILE}") -lt "180000" ]] && rm "${FILE}"
done

Ou para fãs de one-liners:

find . -type f -name \*.mp3 -exec bash -c '[[ $(mediainfo --Output="Audio;%Duration%" $1) -lt "180000" ]] && rm "$1"' -- {} \;
    
por 19.10.2018 / 21:41
3

Você precisará preparar um shell como @dirkt menciona em sua resposta.

Você pode usar ffprobe do grupo ffmpeg para obter duração em segundos -

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1  /path/to/mp3/file.mp3

Você pode usar find para encontrar todos os arquivos terminados em .mp3 em um determinado diretório e em qualquer subdiretório, e chamar um script fornecendo o caminho / nome de arquivo de qualquer arquivo encontrado

find /search/from/dir -type f -iname "*.mp3" -exec /path/to/delete_if_short.sh {} \;

Crie seu script delete_if_short.sh - use o comando ffprobe para verificar o comprimento, se abaixo de 180 (o valor é em segundos, então 3 minutos), então rm do arquivo e você está pronto.

    
por 19.10.2018 / 21:40
2

Existem várias ferramentas que podem imprimir o tempo de duração de reprodução de vários formatos de arquivo de áudio, por exemplo, sox , mediainfo e outros. Qual ferramenta usar depende do formato de seus arquivos de áudio, o que você não nos disse.

Você pode processar essa saída com grep etc. e usá-la em um shell script dentro de um loop como condição para excluir o arquivo.

    
por 16.10.2018 / 08:36
1

Por alguma razão, meu find-foo não foi par, então eu hackeei uma resposta stackexchange de um substituto de localização e descobri isso.

#!/bin/bash
# mytime is the number of seconds of the mp3 that you want to delete,
# in this case 3 minutes
mytime=180
files="$(find -L "<put your top level directory here>" -type f -name  "*.mp3")";
# are there any files at all?
if [[ "$files" == "" ]]; then
    echo "No files";
    return 0;
fi
echo "$files" | while read file; do 
    # take the file, find the time, convert to seconds
    times="$(mp3info -p "%m:%s\n" "$file" |awk -F':' '{print ($1*60)+$2}')"
    # if that is greater than 3*60, we delete the file, which is $file.
    if [[ "$times" -lt "mytime" ]]
    then
        # WARNING, there be dragons here... 
        echo "We are removing $file from the system..."
        rm "$file"
    fi 
done
    
por 19.10.2018 / 23:13