Substituir todos os Colons dos nomes de arquivo pelo terminal

8

Eu tenho um GB de música no meu disco rígido que foi formatado com o EXT4. Eu quero mover esses arquivos para uma partição HDD formatada por FAT. No entanto, não consigo mover a maioria dos meus arquivos porque eles têm ":" nos nomes (por exemplo, "Act 2: ....." para óperas). Existe uma maneira com a linha de comando para renomear todos os meus arquivos de "XXXX: XXXX" para "XXXX-XXXX"?

    
por Ryan McClure 10.12.2012 / 07:13

3 respostas

19

Se todos os seus arquivos estiverem em um único diretório, tente:

rename 's|:|-|g' *

(onde * pode ser alterado para algo mais restritivo se você quiser)

Se você tiver muitos arquivos em uma árvore de diretórios, tente isso na base da árvore:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

Você pode adicionar a opção -n logo após rename para que ele saiba o que faria sem realmente fazer isso. Isso pode ajudá-lo a evitar pisar acidentalmente em outros arquivos ou em algo ruim ...

    
por AeroGT80 10.12.2012 / 09:57
0

Não estou na minha máquina linux agora, então só posso dar informações aproximadas.

O Linux tem um utilitário de linha de comando chamado rename que trabalha com outras entradas, expressões regulares ou regexes. Você deve ser capaz de usar isso junto com um regex como "s /: / - /" em seus arquivos para obter a renomeação desejada.

Apenas para garantir, faça em pequenos lotes e / ou primeiro teste com a simulação (renomear tem um flag que apenas lhe dá o oldname e o novo nome do arquivo sem realmente renomear - use isso para verificar primeiro)

    
por Karthik T 10.12.2012 / 07:20
0

Esta é uma solução em python que lida com o caso em que os arquivos não estão necessariamente no mesmo diretório.

import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
    for dirname in dirs:
        if ':' in dirname:
            torename.append(os.path.join(path, dirname))
    for filename in files:
        if ':' in filename:
            torename.append(os.path.join(path, filename))

print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
    torename.reverse()
    for oldname in torename:
        directory, filename = os.path.split(oldname)
        newname = os.path.join(directory, filename.replace(':', '-'))
        command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
        os.system(command)
        f = open(logfile, 'a')
        f.write(oldname + '\n')
        f.close()
else:
    print "Aborted."
  1. Salve isso em um arquivo (digamos) rename.py.
  2. Altere rootdir para o diretório mais externo que está sendo considerado (use o nome do caminho completo, começando com /. Sem atalhos ou variáveis de env, como ~ permitido). Não é necessário colocar \ antes de caracteres especiais - por exemplo, se o diretório mais externo for /.../Meu HDD, coloque rootdir = "/.../My HDD" NOT rootdir = "/.../My\ HDD" (Observe o "s" [Estou sendo explícito apenas porque você pode estar não familiarizado com python. Não desrespeito pretendido.]
  3. Altere logfile para o local desejado do arquivo de log. No final, esse arquivo conterá a lista de arquivos renomeados - para referência futura.
  4. Ligue para python rename.py .

Aviso: teste em uma pequena amostra antes de arriscar um GB inteiro de música.

Detalhes: a renomeação é realizada a partir dos arquivos mais internos para fora.

    
por S Prasanth 10.12.2012 / 14:18