Renomeando arquivos do Linux que acidentalmente possuem múltiplas extensões .mp3

7

Eu estraguei tudo e acidentalmente tenho um monte de arquivos com a extensão .mp3.mp3.mp3.mp3

Como posso alterá-las, recursivamente - e em vários diretórios - para defini-las como apenas .mp3 ?

    
por user365967 03.12.2014 / 01:55

3 respostas

16

Existe uma solução bastante simples, que é apenas cortar tudo desde o primeiro ".mp3" e depois adicionar ".mp3" novamente. Então:

for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done
    
por 03.12.2014 / 02:55
4

Usando o utilitário rename que vem com perl (pode ser conhecido como perl-rename em alguns sistemas) e um shell com ** (zsh ou bash com shopt -s globstar , entre outros):

rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
    
por 03.12.2014 / 05:29
2

Usando o comando find em bash e alguns scripts de criativos, isso pode ser limpo magicamente . Os scripts a seguir foram testados no Mac OS X 10.9.5, mas também devem funcionar bem no Linux. Primeiro, execute isso como uma "corrida a seco" para ter certeza de que você está direcionando os arquivos certos:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    echo "mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3"
  done

Você deve primeiro alterar o /path/to/your/files para corresponder ao caminho real dos arquivos afetados no sistema. Observe também a última linha que é um echo de um mv (move). Estou fazendo isso para garantir que o script esteja direcionando os arquivos corretos.

A lógica core find é esta:

find '/path/to/your/files' -type f -name '*.mp3.mp3*'

O que basicamente significa, “Localizar todos os arquivos no caminho /path/to/your/files que são realmente arquivos (e não diretórios) que possuem um padrão de nome de arquivo que corresponde a *.mp3.mp3* . Isso deve capturar quaisquer arquivos que tenham mais de um .mp3 anexado a eles; .mp3.mp3 , .mp3.mp3.mp3 , .mp3.mp3.mp3.mp3 , .mp3.mp3.mp3.mp3.mp3 , etc…

O script não se preocupará em lidar com arquivos que tenham o .mp3 correto, o que é um benefício de velocidade definida se você tiver apenas um pequeno subconjunto de arquivos com o nome .mp3.mp3.mp3.mp3 em vez de renomear todos os arquivos com .mp3 .

Portanto, quando você executar, verá uma lista de comandos "% de execução a seco" mv que corrigirão seu problema: Encontre todos esses arquivos .mp3 múltiplos e renomeie-os para um .mp3 adequado e singular.

Agora que isso funciona bem, basta executar o script final assim:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3
  done

Observe que a última linha é o comando mv real e funcional. Quando você executar esta versão do script, todo o diretório será pesquisado por esses vários arquivos .mp3 e, na verdade, executará o comando mv completo para corrigir o problema.

    
por 03.12.2014 / 02:29

Tags