Масове перейменування каталогів для переміщення року з кінця на початок


11

В даний час я борюся з деякими папками музики. Одного разу я вирішив назвати їх за зразком: artist - album - year. Сьогодні я зрозумів, що це не розумний крок, і хочу зараз назвати свої каталоги за зразком: year - artist - albumоскільки вони відображатимуться у порядку зростання, коли вони перераховані.

Я почав робити перейменування вручну, але, маючи приблизно 700 папок, повинен бути більш простий спосіб; Я спробував використовувати, gprenameале я не дуже хороший в регексе і баш сценаріїв ...

Хтось міг допомогти мені позбавити мої бідні кінчики пальців?

Деякі приклади:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

став би

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

EDIT: Деякі назви виконавців та альбомів мають спеціальні символи, як And.Idабо Kool & The Gang. Хоча кожен каталог має -роздільник.


2
Додайте кілька прикладів імен каталогів та очікуваного виводу.
муру

Наприклад: у мене є "Aes Dana - Shell Memory - 2004", і я хотів би мати "2004 - Aes Dana - Shell Memory"
TazMayhem

1
Ви знаєте, як відредагувати питання, то чому б не додати його до питання? Крім того, чи є -в них ім’я альбому чи виконавців ?
muru

Чи ім'я впорядковано розділювачем "-" за визначенням, і чи можливо воно зустрічається в інших місцях назви?
Яків Влійм

Я прагну, щоб папки-джерела переспрямовували в текстовий файл, а потім використовую vim. Я створюю макрос для створення другого параметра для кожного рядка з відповідними компонентами вихідної папки у правильному порядку, потім використовую інший макрос, щоб поставити mv на початку кожного рядка. Я можу навіть зайти так далеко, щоб спершу взяти копію структури папки у випадку, якщо я заплутав / втратив папки.

Відповіді:


16

Якщо припустити, що у вас є доступ до perl rename(зазвичай він доступний в Ubuntu - завдяки @Serg за уточнення різниці. Якщо ви сумніваєтесь, зателефонуйте, /usr/bin/renameі вам слід отримати потрібний), ви можете скористатися:

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

Видаліть -nпісля тестування, щоб фактично перейменувати каталоги. Це передбачає, що всі альбоми датуються від 1000 до 9999 р. Мабуть, розумні ...

Пояснення

  • s/old/newзамінити oldнаnew
  • (.*)збережіть будь-яку кількість будь-яких символів для посилання, як $1пізніше
  • (\d{4})\/збережіть чотири цифри в кінці рядка для посилання, як $2пізніше.
  • */ відповідати всім каталогам (не файлам - дякую @muru за допомогу!)

3
Можливо, */потрібно лише узгоджувати каталоги.
muru

@muru, здається, не працює! Що я роблю дурно?
Занна

1
@Zanna я тонкий, про що вони посилаються, це той факт, що деякі снаряди, як- mkshот вбудовані, мають вбудовану назву rename. Досить замінити його на повний шлях або зателефонувати, prenameщоб зателефонувати на перейменування Perl
Сергій Колодяжний

1
@Zanna знайшов цей цікавий біт: unix.stackexchange.com/a/229248/85039 TL; DR : renameне "іноді називають prename", але, мабуть, це дві "гілки" одного сценарію, таку, яка не підтримується від Debian, та інший, який є. Так що так. . . це багато безладу - у деяких снарядів є свій rename, пакет perl має свій власний rename, а сам debian надає окремий пакет
Сергій Колодяжний,

1
@Zanna Я думав про програму, про яку йдеться rename.ulв unix.stackexchange.com/q/229230/21167
zwol

6

Простий скрипт Python може виконати таку роботу:

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

Вміст сценарію:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

Як це працює:

  • Основна хитрість полягає в тому, що ми виконуємо скрипт з того самого каталогу, де мешкають цілі. Ми також передаємо */лише аргументи до сценарію
  • Сценарій повторює всі аргументи командного рядка, розбиваючи кожне ім'я файлу на список рядків у -символі. Нове ім'я файлу побудовано з частин, які ми дістали.
  • move()Функція від shutilsмодуля - це те, що насправді перейменовує каталоги

Зверніть увагу на використання: ./rename_dirs.py */

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.