Можно ли изменить несколько отличающихся имен файлов?

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

1
задан 7 November 2015 в 11:14

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)

Это будет renane:

enter image description here

в:

enter image description here




Править

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

#!/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)
3
ответ дан 7 December 2019 в 12:42

Другие вопросы по тегам:

Похожие вопросы: