Passar argumentos do arquivo linha por linha para função

4

Eu tenho uma lista de alguns mp3's:

song 1.mp3
song 2.mp3
.
.
.
song 349.mp3

Eu posso ver sua taxa de bits através do botão direito do mouse - > Propriedades - > Áudio / Vídeo , mas também posso verificar usando o comando do terminal

file "song 1.mp3"

Gostaria de descobrir qual taxa de bits da minha lista é mais usada, por isso pensei que seria bem feito via shell, ou seja, shell script.

Eu perderia muito tempo se eu digitasse

file "song 1.mp3"; file "song 2.mp3"; ... ; file "song 349.mp3"

Então, minha pergunta é:

Podemos passar argumentos linha por linha de algum arquivo de texto para a função shell? Um problema adicional é que os nomes das minhas músicas contêm espaços.

    
por mk1024 01.04.2018 / 01:31

2 respostas

9

Supondo que sua lista de arquivos é um nome de arquivo por linha, o utilitário xargs deve ser capaz de manipular nomes de arquivos com espaços neles se você especificar nova linha como o caractere delimitador, por exemplo,

xargs -d '\n' file < filelist.txt

Se você preferir usar uma função de shell

while IFS= read -r f; do [[ -z "$f" ]] || file "$f"; done < filelist.txt
    
por steeldriver 01.04.2018 / 01:54
5

Você pode usar um shell glob como *.mp3 para selecionar todos os arquivos no diretório atual que terminam com .mp3 . Isso cuidará automaticamente de espaços e outros caracteres especiais também.

Em um mp3 que testei, recebi uma saída assim para file :

01 - Mystery Of A Blood Red Rose.mp3:         Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1,  56 kbps, 44.1 kHz, Stereo

Você disse que está interessado na taxa de bits, ou seja, 56 kbps aqui. Podemos usar grep para extrair apenas essa parte da saída com uma expressão regular como '\d+\s+kbps' (um ou mais dígitos, seguido por um ou mais espaços, seguidos pela string "kbps").

Até agora, você pode usar isso para mostrar apenas as informações da taxa de bits de todos os arquivos mp3 no diretório atual:

file *.mp3 | grep -Po '\d+\s+kbps'

Agora, isso produz uma longa lista com uma linha por arquivo, mas você queria uma boa estatística com contagens totais. Podemos fazer isso classificando a lista primeiro (usando o modo de ordenação numérica natural) e, em seguida, contando quantas vezes cada linha única aparece. As ferramentas para isso são sort e uniq :

file *.mp3 | grep -Po '\d+\s+kbps' | sort -n | uniq -c

Em uma das minhas pastas de música, a saída ficou abaixo. Primeiro número é a contagem de arquivos, segundo a taxa de bits:

 16 32 kbps
 18 56 kbps
 67 128 kbps
  3 192 kbps
  6 256 kbps
 38 320 kbps
    
por Byte Commander 01.04.2018 / 02:02