id3v2 usado recursivamente na linha de comando?

5

Tentando limpar minhas tags id3 e estou amando id3v2 na linha de comando - mas eu tenho usado isso apenas com um curinga * .mp3 e quero explorar se há uma maneira de usá-lo recursivamente para que eu possa lote todos os meus MP3s. Não parece haver uma opção para usá-lo recursivamente.

Tenho certeza de que todos vocês, impressionantes, especialistas em linha de comando sabem de uma maneira doce de fazer isso, mas ainda estou aprendendo com isso ...

Aqui estão os comandos que eu aliasse para força bruta:

id3v2 --remove-frame "COMM" *.mp3
id3v2 --remove-frame "PRIV" *.mp3
id3v2 -s *.mp3

Então - existe uma maneira de fazer isso de forma recursiva, para que eu possa executá-lo na raiz da minha pasta de músicas? Gravy aponta para: incluindo outros tipos de arquivos de áudio e reduzindo todos os três comandos acima em um comando uber (eu posso fazer isso com o ; entre os comandos ... certo?)

    
por chow 12.09.2012 / 04:59

3 respostas

5

Você deve conseguir fazer isso em uma única linha, com algo assim:

find . -name '*.mp3' -execdir id3v2 --remove-frame "COMM" '{}' \; -execdir id3v2 --remove-frame "PRIV" '{}' \; -execdir id3v2 -s '{}' \;

Os {} são substituídos pela correspondência de nome de arquivo atual. Colocá-los entre aspas ( '' ) protege-os do shell. O -execdir é executado até atingir um ponto e vírgula, mas o ponto e vírgula ( ; ) precisa escapar do shell, portanto, o uso da barra invertida ( \ ). Tudo isso está descrito na manpage do find :

-exec command ;
      Execute  command;  true  if 0 status is returned.  All following
      arguments to find are taken to be arguments to the command until
      an  argument  consisting of ';' is encountered.  The string '{}'
      is replaced by the current file name being processed  everywhere
      it occurs in the arguments to the command, not just in arguments
      where it is alone, as in some versions of find. 
-execdir command {} +
      Like -exec, but the specified command is run from the  subdirec‐
      tory  containing  the  matched  file,  which is not normally the
      directory in which you started find.  This a  much  more  secure
      method  for invoking commands...

Desde que você soa como um pouco novo para isso, uma ressalva : Como sempre com comandos shell complexos, corra-os com cuidado, e tente em um diretório de testes primeiro, para ter certeza que você entendeu o que vai acontecer. Com grande poder vem uma grande responsabilidade!

    
por 12.09.2012 / 05:15
2

Uma solução rápida é percorrer todas as subpastas e processar todos os arquivos:

find . -type d | while IFS= read -r d; do
  cd "${d}"
  id3v2 --remove-frame "COMM" *.mp3
  id3v2 --remove-frame "PRIV" *.mp3
  id3v2 -s *.mp3
  cd -
done
    
por 12.09.2012 / 05:06
0

Eu não uso id3v2 , então não posso ter certeza, mas há uma boa chance de você combinar todos os seus comandos em um:

id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s *.mp3

Para executar este comando em arquivos MP3 em subdiretórios, execute

id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s **/*.mp3

**/*.mp3 corresponde .mp3 arquivos no diretório atual e seus subdiretórios recursivamente. Se seu shell for zsh, **/ funcionará imediatamente. Se o seu shell é bash ≥4, você precisa executar shopt -s globstar primeiro (coloque esta linha no seu ~/.bashrc ). Em ksh, você precisa executar set -o globstar (coloque em ~/.kshrc ). Se você tiver outro shell, ou se esta tentativa falhar com uma mensagem informando que a linha de comando é muito grande, você terá que usar o método find abaixo (com variantes como as fornecidas em outras respostas).

Uma maneira mais complexa, mas mais flexível e mais portátil de agir em arquivos em um diretório e em seus subdiretórios recursivamente é o comando find :

find . -type f -name '*.mp3' -exec id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s {} +

O comando após -exec é executado com o {} + bit no final, substituído pelos caminhos dos arquivos correspondentes. Se você precisar executar vários comandos id3v2 , use várias diretivas -exec :

find . -type f -name '*.mp3' -exec id3v2 --remove-frame "COMM" {} + -exec id3v2 --remove-frame "PRIV" {} + -exec id3v2 -s {} +
    
por 13.09.2012 / 02:21