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
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
?
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
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.
Tags rename