Используя раздел ntfs на внешнем жестком диске в Linux, я хотел бы иметь возможность переименовывать каталоги с одинаковыми именами в другом регистре, чтобы использовать один и тот же диск в Windows.

Проблема в том, что заглавные буквы могут быть где угодно в имени каталога, и заглавные буквы могут быть в обеих директориях. Я знаю, как переименовать каталоги, но не знаю, как проверить, существует ли каталог с такими характеристиками.

Я разработал сценарий на python для решения некоторых проблем, поэтому, если бы решение было на python, было бы лучше, но bash также сделает это.

Например :

fiRstdiRectory
firSTDirectory

Скрипт переименует первый каталог в:

firstdirectory_0

1 ответ1

1

Попробуйте сделать это так

#!/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]

Предположим, у меня есть следующие записи в каталоге

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

Другими словами, это все каталоги, кроме "a", который является обычным файлом. Запуск этого скрипта даст следующий вывод

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

и каталог теперь содержит следующие записи

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

Сценарий переименовывает только каталоги (вы упомянули, что вы переименовываете только каталоги) и преобразует имена всего, что переименовывает, во все строчные буквы (на основе вашего примера). Также осторожно, чтобы не переименовывать каталог в имя, которое уже существует (следовательно, b -> b_1 в моем примере, так как B_0 уже существует).

Надеюсь, что это работает для вас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .