Можете ли вы изменить несколько разнородных имен файлов?
Я пытаюсь переименовать много музыкальных файлов. Файлы содержат пробелы и заглавные буквы и еще много чего, и я хочу заменить пробелы подчеркиванием и удалить все заглавные буквы. Есть способ сделать это? Я видел меняющиеся расширения и несколько имен файлов, которые почти идентичны, за исключением нескольких букв или цифр, но ничего не изменилось.
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)
