Arquivos de áudio alterados por um comando bash renomeando-os

1

Hoje eu envio um caso de uma conseqüência inesperada de um comando shell em alguns arquivos de áudio que eu não entendo de forma alguma.

Aqui estão os fatos:

  1. Meu sistema operacional é o ArchLinux, o gerenciador de janelas é Awesome e o terminal usado é o Konsole.

  2. Ter muitos diretórios e arquivos contendo espaços e / ou caracteres específicos como ',{,[,?,! Eu queria renomeá-los removendo quaisquer espaços e / ou caracteres específicos.

  3. Procurando por um comando shell, descobri que este substitui (por exemplo) o caractere _ por . :

$ find ./ -tipo f -exec sed -i -e /_/./g '{} \;

  1. Eu usei este comando em muitos diretórios nos quais todos os arquivos foram renomeados como esperado, fiquei feliz com isso.

Mas

  1. Tendo alguns diretórios contendo alguns arquivos de áudio que eu queria renomear, apliquei esse comando bash nesses diretórios. Ao contrário dos usos anteriores, o processo demorou mais e, no final, o resultado não foi esperado. Primeiro, a maioria dos arquivos não foi renomeada. Segundo, todos os arquivos de áudio (mp3, flac, ...) foram alterados / corrompidos e não são mais identificados por nenhum leitor de arquivos de áudio. Por contraste, os arquivos de áudio nos quais eu não usei o comando bash estão sempre certos e podem ser lidos.

Por exemplo, quando tento ler um dos arquivos alterados com o smplayer, a mensagem de erro é: MPlayer / mpv terminou inesperadamente. Código de saída: 2. O arquivo de log adiciona: 'Falha ao reconhecer formato de arquivo'.

Referindo-se à primeira resposta, dou abaixo informações adicionais sobre os efeitos da alteração.

Ter usado 3 comandos para conseguir o que eu queria:

  • encontre ./ -tipo f -exec sed -i -e /_/./g '{} \;

  • encontre ./ -tipo f -exec sed -i -e / /./g '{} \;

  • encontre ./ -tipo f -exec sed -i -e /.././ g '{} \;

Aqui estão alguns exemplos de nomes de arquivos antes de > depois da corrupção:

1 _-_ Bob_The_Sponge _-_ Viver sob o Sea.flac > 1 .-. Bob.The.Sponge.-. Living.under the Sea.flac (note que alguns espaços ainda estão presentes)

2 _-_ Bob_The_Sponge _-_ Nemo_my_friend.mp3 > 2 .-. Bob_The.Sponge .-. Nemo my.friend.mp3 (note que um '_' não foi removido e um espaço foi adicionado no nome).

Todos os casos não podem ser reproduzidos aqui, alguns nomes de arquivos foram bem alterados, outros parcialmente, outros são como antes.

O peso dos arquivos alterados não mudou, nem os direitos desses arquivos. Apenas a data da última modificação foi alterada.

Naturalmente, gostaria de entender o que aconteceu. Eu tentei encontrar explicações com navegadores diferentes, mas não encontrei nenhum problema semelhante ou próximo.

Então, minhas perguntas são:

  1. Por que esse comando bash parece ter alterado esses arquivos de áudio?
  2. Por que esse comando tem efeito nesse tipo de arquivo e não nos outros?
  3. Qual poderia ser a solução para reverter os danos desse comando nesses arquivos?
por corto037 12.11.2016 / 12:34

1 resposta

3

Você usou o seguinte comando

find ./ -type f -exec sed -i -e 's/_/./g' {} \;

O que isso basicamente faz é

sed -i -e 's/_/./g' filename

para cada arquivo encontrado pelo comando find . sed passa pelos arquivos, linha por linha, e o comando s (substituto) substitui cada _ por . . E como você está usando o sinal -i , isso acontece inline. Não é de admirar que seus arquivos tenham sido corrompidos!

Você não poderá reproduzir seus arquivos antigos. Você alterou _ , e .. para . . Tudo o que você sabe é que cada . em seus arquivos pode ser um desses caracteres (ou um . ).

    
por 12.11.2016 / 15:20