Linux python scripting verifique o diretório que tem o mesmo nome, mas caso diferente

0

Usando uma partição ntfs em um disco rígido externo no Linux, eu gostaria de poder renomear diretórios que tenham o mesmo nome com letras diferentes para usar o mesmo disco no Windows.

A questão é que as letras maiúsculas podem estar em qualquer lugar no nome do diretório e pode haver letras maiúsculas nos dois diretórios. Eu sei como renomear diretórios, mas não como verificar se existe um diretório com tais características.

Eu desenvolvi um script em python para resolver alguns problemas, portanto, se a solução estivesse em python, seria melhor, mas o bash também faria isso.

Por exemplo:

fiRstdiRectory
firSTDirectory

O script renomeia o primeiro diretório para:

firstdirectory_0
    
por user3714670 21.11.2016 / 18:26

1 resposta

1

Tente fazer isso assim

#!/usr/bin/python
import os

# Collect the names and type (file or directory)
filenames = os.listdir(".")
filetypes = map(lambda x: os.path.isdir(x), filenames)
files = zip(filenames, filetypes)
files = sorted(files, key=lambda x: (x[0].lower(), x[1]))

# Create a set of downcased filenames for quick lookup
files_lower = set()
for f in files:
    files_lower.add(f[0].lower())

previous_name = ""

# Rename the files
for f in files:
    if f[0].lower() == previous_name.lower() and f[1] is True:
        # Find an unused index
        c = 0
        while True:
            f_rename = f[0].lower() + "_" + str(c)
            if f_rename.lower() in files_lower:
                c += 1
            else:
                print("renaming %s to %s" % (f[0], f_rename))
                os.rename(f[0], f_rename)
                files_lower.add(f_rename.lower())
                break
    previous_name = f[0]

Suponha que eu tenha as seguintes entradas em um diretório

$ ls -F
a  A/  b/  B/  B_0/  bb/  bB/  Bb/  BB/  c/  d/  D/

Em outras palavras, todos eles são diretórios, exceto "a", que é um arquivo normal. A execução deste script fornecerá a seguinte saída

renaming A to a_0
renaming b to b_1
renaming Bb to bb_0
renaming bB to bb_1
renaming bb to bb_2
renaming d to d_0

e o diretório agora contém as seguintes entradas

$ ls -F
a  a_0/  B/  B_0/  b_1/  BB/  bb_0/  bb_1/  bb_2/  c/  D/  d_0/

O script apenas renomeia os diretórios (você mencionou que está apenas renomeando os diretórios) e converte os nomes de qualquer coisa que ele renomeia para todas as letras minúsculas (com base no seu exemplo). Também é cuidadoso em não renomear um diretório para um nome que já existe (daí o b - > b_1 no meu exemplo desde B_0 já existia).

Espero que isso funcione para você.

    
por 21.11.2016 / 19:57