Como limpar as extensões de arquivo?

8

Eu tenho um diretório com arquivos .MP3 que eu gostaria de mudar as extensões para .mp3. Qual é a maneira mais fácil de fazer isso? Eu acho que algo ao longo das linhas de:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/.mp3/ \; 

... embora eu saiba que não está certo. :) A substituição não está correta e não sei como usar os comandos mv e sed com -exec em find .

Eu precisaria de um script bash para isso?

    
por Caleb 01.02.2011 / 21:52

7 respostas

11

Aqui está uma maneira de fazer isso no Bash:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Eu usei echo aqui para que o comando não faça nada além de imprimir pares de nomes de arquivos. Se essa lista representa as alterações que você deseja fazer, você pode alterar echo para algo como mv -i -- , que moverá seus arquivos (e avisará você antes de sobrescrever).

Breve Explicação:

O for itera em todos os arquivos correspondidos por * . Em seguida, determinamos se a extensão já é minúscula, se formos prosseguir, se não for, prosseguiremos para movê-la (ou fazê-la ecoar, conforme o caso). Isso usa as operações internas de string do Bash sobre as quais você pode ler aqui: link

    
por 01.02.2011 / 22:30
7

No zsh:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

Para cuidar também dos arquivos .Mp3 ou .mP3 :

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'
    
por 02.02.2011 / 00:48
6

Você pode usar o comando renomear (cuidado, existem duas implementações principais com diferentes APIs) para eles. Por exemplo, para alterar o caso das extensões de nome de arquivo de cima para baixo, tente isto:

  • com rename de util-linux (às vezes chamado rename.ul ), assumindo que .JPG ocorre apenas uma vez nos nomes dos arquivos

    rename -- .JPG .jpg *.JPG
    
  • com o rename de perl (às vezes chamado de prename ; várias variantes foram publicadas):

    rename 's/\.JPG$/.jpg/' ./*.JPG
    

Aqui estão alguns caras tutorial sobre como ele se mudou de um script bash desordenado para este comando simples para exatamente o seu caso de uso.

Outro comando sofisticado para fazer isso é pax . Se você estiver usando o ZSH para o seu shell, você também pode usar zmv .

    
por 11.06.2011 / 21:42
3

Use perl-rename , canivete suíço de arquivo -renaming com expressões regulares (no Ubuntu, este é fornecido com o pacote perl como nome de usuário):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Se você for do tipo cuidadoso, use as opções -n e -v para renomear o perl para ver o que ele realmente fará.

    
por 01.02.2011 / 22:39
0

Você precisa de um script, porque "extensões" no Linux são na verdade apenas partes da cadeia de nomes de arquivos. Você precisa fazer alguma manipulação de string no script para obter o novo nome.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

A aspas duplas é importante se você tiver nomes de arquivo com espaços em branco neles. Eu pensei que algumas das citações duplas eram um pouco óbvias.

    
por 11.06.2011 / 21:39
0

No bash:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done
    
por 20.11.2014 / 15:50
0

primeiro faça backup dos seus arquivos! você pode usar um one-liner de python:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

EDITAR:

Aqui está uma explicação detalhada de como o one-liner realmente funciona. Usando python -c , estamos passando um comando para o interpretador python. Depois de importar as bibliotecas os para a função rename e glob para a listagem de arquivos, precisamos iterar pela lista de arquivos no diretório fornecido, que chamei de PATH_TO_YOUR_DIRECTORY , por exemplo algo como ./* para tudo no diretório atual.

Infelizmente, na sintaxe de uma linha, for loops não funcionam após import de notação, então precisamos usar a notação de colchetes. Ou seja para cada arquivo ou nome de diretório que glob está nos dando do caminho dado na forma de uma string, substituímos * .MP3 por * .mp3.

Como o OP não mencionou a pesquisa recursiva, eu não o incluí em primeiro lugar.

    
por 30.07.2018 / 12:07