Mengganti nama direktori secara massal untuk memindahkan tahun dari akhir ke awal

11

Saat ini saya berjuang dengan beberapa folder musik. Saya pernah memutuskan untuk nama mereka mengikuti pola: artist - album - year. Saya menyadari hari ini bahwa ini bukan langkah yang cerdas dan ingin sekarang untuk nama direktori saya mengikuti pola: year - artist - albumkarena mereka kemudian akan muncul dalam urutan naik ketika terdaftar.

Saya mulai melakukan penggantian nama dengan tangan tetapi, dengan sekitar 700 folder, harus ada cara yang lebih sederhana; Saya mencoba menggunakan gprenametetapi saya tidak begitu mahir dalam regex dan bash scripting ...

Adakah orang yang bisa membantu saya melepaskan ujung jari saya yang malang?

Beberapa contoh:

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

akan menjadi

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

EDIT: Beberapa nama artis dan album memiliki karakter khusus seperti And.Idatau Kool & The Gang. Padahal setiap direktori memiliki -sebagai pemisah.

TazMayhem
sumber
2
Silakan tambahkan beberapa nama direktori contoh dan output yang diharapkan.
muru
Sebagai contoh: Saya memiliki "Aes Dana - Memory Shell - 2004" dan saya ingin memiliki "2004 - Aes Dana - Memory Shell"
TazMayhem
1
Anda tahu cara mengedit pertanyaan, jadi mengapa Anda tidak menambahkannya ke pertanyaan? Juga, apakah ada nama album atau artis yang ada -di dalamnya?
muru
Apakah nama diatur oleh pembatas "-" menurut definisi, dan apakah itu mungkin terjadi di tempat lain dalam namanya?
Jacob Vlijm
Saya cenderung ls folder sumber mengarahkan ke file teks, kemudian gunakan vim. Saya membuat makro untuk membuat parameter kedua untuk setiap baris dengan komponen yang relevan dari folder sumber dalam urutan yang benar, kemudian menggunakan makro lain untuk meletakkan mv di awal setiap baris. Saya bahkan mungkin melangkah lebih jauh dengan mengambil salinan struktur folder terlebih dahulu jika saya membuat folder berantakan / hilang.

Jawaban:

16

Dengan asumsi Anda memiliki akses ke perl rename(umumnya tersedia di Ubuntu - terima kasih kepada @Serg untuk menjelaskan perbedaannya. Jika ragu, hubungi /usr/bin/renamedan Anda harus mendapatkan yang benar), Anda dapat menggunakan:

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

Hapus -nsetelah pengujian untuk benar-benar mengganti nama direktori. Ini mengasumsikan semua tanggal album antara 1000 dan 9999. Mungkin masuk akal ...

Penjelasan

  • s/old/newganti olddengannew
  • (.*)simpan sejumlah karakter apa saja untuk referensi sebagai $1nanti
  • (\d{4})\/simpan empat digit di akhir baris sebagai referensi $2nanti.
  • */ cocokkan semua direktori (bukan file - terima kasih ke @muru untuk bantuan!)
Zanna
sumber
3
Mungkin lakukan */hanya untuk mencocokkan direktori.
muru
@muru sepertinya tidak berhasil! Apa yang saya lakukan dengan bodoh?
Zanna
1
@Zanna saya tahu apa yang mereka maksud adalah fakta bahwa beberapa cangkang seperti mkshmemiliki built-in yang disebut rename. Cukup untuk menggantinya dengan jalur penuh atau panggilan prenameuntuk memanggil nama Perl
Sergiy Kolodyazhnyy
1
@Zanna Menemukan bit yang menarik ini: unix.stackexchange.com/a/229248/85039 TL; DR : Ini renamebukan "kadang-kadang disebut prename" tetapi tampaknya mereka adalah dua "cabang" dari skrip yang sama, salah satu yang tidak dikelola oleh Debian, dan yang lainnya. Jadi ya. . . itu sangat berantakan - beberapa shell memiliki sendiri rename, paket perl memiliki sendiri rename, dan debian sendiri menyediakan paket terpisah
Sergiy Kolodyazhnyy
1
@Zanna Saya sedang memikirkan program yang dimaksud rename.uldalam unix.stackexchange.com/q/229230/21167
zwol
6

Skrip Python sederhana dapat melakukan pekerjaan seperti itu:

$ 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

Isi skrip:

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

Bagaimana ini bekerja:

  • Trik utamanya adalah kita menjalankan skrip dari direktori yang sama di mana target berada. Kami juga */memberikan hanya direktori sebagai argumen untuk skrip
  • Script iterates atas semua argumen command-line, memecah setiap nama file ke dalam daftar string di -karakter. Nama file baru dibuat dari bagian yang kami ekstrak.
  • move()fungsi dari shutilsmodul adalah apa yang sebenarnya mengubah nama direktori

Perhatikan penggunaannya: ./rename_dirs.py */

Sergiy Kolodyazhnyy
sumber