Masowa zmiana nazw katalogów, aby przenieść rok od końca do początku

11

Obecnie mam problemy z niektórymi folderami muzycznymi. Kiedyś postanowił nazwać je według wzoru: artist - album - year. Uświadomiłem sobie dzisiaj, że to nie był sprytny ruch i chcę teraz nazwać moje katalogi według tego wzoru: year - artist - albumponieważ będą one wyświetlane w porządku rosnącym, gdy zostaną wymienione.

Zacząłem zmieniać nazwę ręcznie, ale przy około 700 folderach musi istnieć prostszy sposób; Próbowałem używać, gprenameale nie jestem zbyt dobry w skryptach regularnych i bashowych ...

Czy jest ktoś, kto mógłby mi pomóc oszczędzić moje słabe opuszki palców?

Kilka przykładów:

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

stanie się

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

EDYCJA: Niektóre nazwy wykonawców i albumów zawierają znaki specjalne, takie jak And.Idlub Kool & The Gang. Chociaż każdy katalog ma -jako separator.

TazMayhem
źródło
2
Dodaj przykładowe nazwy katalogów i oczekiwane dane wyjściowe.
muru
Na przykład: Mam „Aes Dana - Memory Shell - 2004” i chciałbym mieć „2004 - Aes Dana - Memory Shell”
TazMayhem
1
Wiesz, jak edytować pytanie, więc dlaczego nie dodasz go do pytania? Ponadto, czy zawiera -w nich nazwa albumu lub wykonawcy ?
muru
Czy nazwa jest uporządkowana przez separator „-” z definicji i czy może występować gdzie indziej w nazwie?
Jacob Vlijm
Zwykle przekierowuję foldery źródłowe do pliku tekstowego, a następnie używam vima. Tworzę makro, aby utworzyć drugi parametr dla każdej linii z odpowiednimi komponentami folderu źródłowego we właściwej kolejności, a następnie używam innego makra, aby umieścić mv na początku każdej linii. Mogę nawet posunąć się tak daleko, aby najpierw zrobić kopię struktury folderów, na wypadek, gdyby zrobiłem bałagan / utraciłem foldery.

Odpowiedzi:

16

Zakładając, że masz dostęp do perla rename(ogólnie dostępny w Ubuntu - dzięki @Serg za wyjaśnienie różnicy. W razie wątpliwości zadzwoń, /usr/bin/renamea powinieneś uzyskać właściwy), możesz użyć:

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

Usuń -npo przetestowaniu, aby faktycznie zmienić nazwy katalogów. Zakłada się, że wszystkie albumy pochodzą z okresu od 1000 do 9999. Prawdopodobnie rozsądne ...

Wyjaśnienie

  • s/old/newwymienić oldznew
  • (.*)zapisz dowolną liczbę dowolnych znaków, aby odwoływać się $1później
  • (\d{4})\/zapisz cztery cyfry na końcu linii, aby odwołać się do nich $2później.
  • */ dopasuj wszystkie katalogi (nie pliki - dzięki @muru za pomoc!)
Zanna
źródło
3
Może */warto dopasować tylko katalogi.
muru
@muru wydaje się nie działać! Co robię głupio?
Zanna
1
@Zanna I cienki to, o czym mówią, to fakt, że niektóre takie powłoki mkshmają wbudowane tzw rename. Wystarczy zastąpić ją pełną ścieżką lub zadzwonić, prenameaby zadzwonić do zmiany nazwy Perla
Sergiy Kolodyazhnyy
1
@Zanna Znalazł ten interesujący bit: unix.stackexchange.com/a/229248/85039 TL; DR : Nie renamejest „czasami nazywany prename”, ale najwyraźniej są to dwie „gałęzie” tego samego skryptu, jedna nieobsługiwana przez Debiana i ten drugi. Więc tak . . . jest mnóstwo bałaganu - niektóre powłoki mają własne rename, pakiet perla ma własne rename, a sam debian zapewnia osobny pakiet
Sergiy Kolodyazhnyy
1
@Zanna Myślałam programu dalej rename.ulw unix.stackexchange.com/q/229230/21167
Zwol
6

Prosty skrypt Pythona może wykonywać takie zadania:

$ 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

Treść skryptu:

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

Jak to działa:

  • Główną sztuczką jest to, że wykonujemy skrypt z tego samego katalogu, w którym znajdują się cele. Przechodzimy również, */aby dostarczyć tylko katalogi jako argumenty skryptu
  • Skrypt iteruje wszystkie argumenty wiersza poleceń, dzieląc każdą nazwę pliku na listę ciągów -znaków. Nowa nazwa pliku jest zbudowana z wyodrębnionych części.
  • move()funkcja z shutilsmodułu faktycznie zmienia nazwy katalogów

Zwróć uwagę na użycie: ./rename_dirs.py */

Sergiy Kolodyazhnyy
źródło