Рекурсивно переименуйте все файлы и папки к Случаю Заголовка от терминала

Я - новичок, и я искал везде это, я также попытался комбинировать строчную команду переименования с некоторым regex для получения Случая Заголовка вместо нижнего регистра, но я не был очень успешен.

Эта команда преобразовывает все (файлы + папки) в данной папке к нижнему регистру:

while IFS= read -r -d '' file; do mv -b -- "$file" "${file,,}"; done < <(find . -depth -name '*[A-Z]*' -print0)

И это - моя попытка случая заголовка, она работает, но это не рекурсивно:

find . -name "*.flac" -print0 | while read -d $'\0' file; do rename 's/(^|[\s\(\)\[\]_-])([a-z])/$1\u$2/g' *; done

Это - просто некоторые мои попытки, если бы существуют лучшие, более короткие решения, я в значительной степени хотел бы их вместо этого.

Вы могли выручить меня?Заранее спасибо!

Править: Я забыл упоминать, мои файлы похожи на это: "09 - Дорога к Дому - Amy MacDonald.flac"; должен быть переименован к "09 - Дороге К Дому - Amy Macdonald.flac". Заметьте, как уже существуют слова заголовка в корпусе, а также прописные буквы посреди слова.

5
задан 24 February 2015 в 07:18

2 ответа

Для использования сценария ниже Вам не нужны больше, чем способность вставить :)

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

  1. Вставьте сценарий ниже в пустой файл, сохраните его как (например). rename_title.py
  2. сделайте это исполняемым файлом (по причинам удобства) chmod u+x rename_title.py
  3. Выполните его с каталогом для переименования как аргумент:

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

Сценарий

#!/usr/bin/env python3
import os
import sys
import shutil

directory = sys.argv[1]

skip = ["a", "an", "the", "and", "but", "or", "nor", "at", "by", "for", "from", "in", "into", "of", "off", "on", "onto", "out", "over", "to", "up", "with", "as"]
replace = [["(", "["], [")", "]"], ["{", "["], ["}", "]"]]
def exclude_words(name):
    for item in skip:
        name = name.replace(" "+item.title()+" ", " "+item.lower()+" ")
    # on request of OP, added a replace option for parethesis etc.
    for item in replace:
        name = name.replace(item[0], item[1])
    return name

for root, dirs, files in os.walk(directory):
    for f in files:
        split = f.find(".")
        if split not in (0, -1):
            name = ("").join((f[:split].lower().title(), f[split:].lower()))
        else:
            name = f.lower().title()
        name = exclude_words(name)
        shutil.move(root+"/"+f, root+"/"+name)
for root, dirs, files in os.walk(directory):
    for dr in dirs:
        name = dr.lower().title()
        name = exclude_words(name)
        shutil.move(root+"/"+dr, root+"/"+name)

Примеры:

a file > A File
a fiLE.tXT > A File.txt
A folder > A Folder
a folder > A Folder

И более сложный, исключая ["a", "an", "the", "and", "but", "or", "nor", "at", "by", "for", "from", "in", "into", "of", "off", "on", "onto", "out", "over", "to", "up", "with", "as"]:

down BY the rIVER for my uncLE To get water.TXT

становится:

Down By the River for My Uncle to Get Water.txt

и т.д. это просто делает все файлы и папки (рекурсивно) Случаем Заголовка, нижним регистром расширений.

Править: Я добавил все статьи, соединения и предлоги, которые не должны быть использованы для своей выгоды согласно правилам капитализации для заголовков песни.

5
ответ дан 23 November 2019 в 09:13

Если Вы используете find -exedir, то имена передаются любая команда с ведущими компонентами удаленного пути, как ./sOmE fILE. Вы могли тогда случай заголовка каждая последовательность словесных символов, которой предшествуют или продвижением / или пробелом, например,

find path/ -execdir rename -nv -- 's/(?<=[\/\s])(\w)(\w*)/\u$1\L$2/g' {} +
1
ответ дан 23 November 2019 в 09:13

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

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