Можете ли вы изменить несколько разнородных имен файлов?

Я пытаюсь переименовать много музыкальных файлов. Файлы содержат пробелы и заглавные буквы и еще много чего, и я хочу заменить пробелы подчеркиванием и удалить все заглавные буквы. Есть способ сделать это? Я видел меняющиеся расширения и несколько имен файлов, которые почти идентичны, за исключением нескольких букв или цифр, но ничего не изменилось.

1 ответ

Решение

Небольшой скрипт на python сделает рекурсивное переименование:

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

где:

  • lower() опустит все возможные столицы.
  • replace(" ", "_") заменит пробелы подчеркиванием.
  • if f != new_f переименует файлы, только если это действительно необходимо.
  • shutil.move(f, new_f) фактически переименует файл.

Как пользоваться

  • Скопируйте скрипт в пустой файл
  • Сохранить как rename.py
  • Запустите его с целевым каталогом в качестве аргумента:

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

Заметки

  • Используйте кавычки, если целевой каталог содержит пробелы.
  • Имейте в виду, что вы столкнетесь с конфликтами имен, если переименованное имя файла уже существует.

В случае возможных именных столкновений

(Если вы уже начали переименовывать вручную, например) Используйте версию ниже.

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

Это будет переименован:

в:




РЕДАКТИРОВАТЬ

Сценарий выше переименует файлы. Из комментария я понимаю, что вы хотели бы переименовать папки аналогичным образом. Это можно сделать всего несколькими строками:

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

объяснение

Во втором сценарии способ, которым файлы были переименованы, преобразуется в функцию, чтобы предотвратить запись одного и того же кода дважды (запуск его в обеих файлах / папках). Впоследствии скрипт сначала переименовывает файлы, затем папки рекурсивно:

#!/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)
Другие вопросы по тегам