Você pode alterar vários nomes de arquivos dissimilares?

1

Estou tentando renomear muitos arquivos de música. Os arquivos contêm espaços e letras maiúsculas e minúsculas e eu quero substituir os espaços por sublinhados e remover todas as letras maiúsculas. Existe uma maneira de fazer isso? Eu vi mudanças de extensões e vários nomes de arquivos que são quase idênticos, exceto por algumas letras ou números alterados, mas nada como o que eu preciso.

    
por Ron Deeds 07.11.2015 / 08:41

1 resposta

3

Um pequeno script python fará a renomeação recursivamente:

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for f in files:
        new_f = root+"/"+f.replace(" ", "_").lower()
        f = root+"/"+f
        if f != new_f:
            shutil.move(f, new_f)

onde:

  • lower() diminuirá todos os capitais possíveis.
  • replace(" ", "_") substituirá espaços por sublinhados.
  • if f != new_f somente renomeará os arquivos se for realmente necessário.
  • shutil.move(f, new_f) irá realmente renomear o arquivo.

Como usar

  • Copie o script em um arquivo vazio
  • Salvar como rename.py
  • Execute-o com o diretório de destino como argumento:

    python3 /path/to/rename.py <directory>
    

Notas

  • Use aspas se o diretório de destino incluir espaços.
  • Lembre-se de que você se deparará com confrontos de nomes se o nome do arquivo renomeado já existir.

Em caso de possíveis confrontos de nomes

(Se você já começou a renomear manualmente, por exemplo) Use a versão abaixo.

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for f in files:
        renamed = f.replace(" ", "_").lower() ;new_f = root+"/"+renamed
        old_f = root+"/"+f
        if old_f != new_f:
            n = 1
            while os.path.exists(new_f):
                new_f = root+"/dupe_"+str(n)+"_"+renamed
                n = n+1
            shutil.move(old_f, new_f)

Irá renatar:

para:



EDITAR

O script acima renomeará arquivos . De um comentário, eu entendo que você gostaria de renomear as pastas da mesma forma. Com apenas algumas linhas, isso pode ser feito:

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

def name_edit(item, root):
    renamed = item.replace(" ", "_").lower() ;new_item = root+"/"+renamed
    old_item = root+"/"+item
    if old_item != new_item:
        n = 1
        while os.path.exists(new_item):
            new_item = root+"/dupe_"+str(n)+"_"+renamed
            n = n+1
        shutil.move(old_item, new_item)

for root, dirs, files in os.walk(directory):
    for item in files:
        name_edit(item, root)
    for item in dirs:
        name_edit(item, root)

Explicação

No segundo script, a forma como os arquivos foram renomeados é convertida em uma função , para evitar que o mesmo código seja escrito duas vezes (em ambos os arquivos / pastas). Posteriormente, o script primeiro renomeia os arquivos , depois as pastas de forma recursiva:

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

def name_edit(item, root):
    # in one command, both replace spaces and lower {possible} capitals
    renamed = item.replace(" ", "_").lower()
    # combine directory and (new) file- or folder name
    new_item = root+"/"+renamed
    # combine directory and (old) file- or folder name
    old_item = root+"/"+item
    # if the name was changed, check for possible existing dupes
    # and rename until the name is unique
    if old_item != new_item:
        n = 1
        while os.path.exists(new_item):
            new_item = root+"/dupe_"+str(n)+"_"+renamed
            n = n+1
        # if the file or folder name was changed, apply the change
        shutil.move(old_item, new_item)

for root, dirs, files in os.walk(directory):
    # use os.walk() to find files and folders recursively
    for item in files:
        name_edit(item, root)
    for item in dirs:
        name_edit(item, root)
    
por Jacob Vlijm 07.11.2015 / 09:10