Yılı baştan sona taşımak için toplu yeniden adlandırma dizinleri


11

Şu anda bazı müzik klasörleriyle mücadele ediyorum. Bir keresinde desen aşağıdaki onlara isim verdi: artist - album - year. Bugün bunun akıllıca bir hamle olmadığını fark ettim ve şimdi dizinleri kalıbı takip ederek adlandırmak istiyorum: year - artist - albumlistelendiklerinde artan sırada görünecekler.

Yeniden adlandırmayı elle yapmaya başladım, ancak yaklaşık 700 klasörle daha basit bir yol olmalı; Kullanmayı denedim gprenameama regex ve bash komut dosyalarında o kadar iyi değilim ...

Zavallı parmak uçlarımı yedeklememe yardımcı olabilecek biri var mı?

Bazı örnekler:

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

olacaktı

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

DÜZENLEME: Bazı sanatçı ve albüm adlarında And.Idveya gibi özel karakterler bulunur Kool & The Gang. Her dizinde -ayırıcı olmasına rağmen .


1
Soruyu nasıl düzenleyeceğinizi biliyorsunuz, neden soruyu soruya eklemiyorsunuz? Ayrıca, albüm veya sanatçı adlarından herhangi birinde var -mı?
muru

Ad "-" sınırlayıcısı tarafından tanım gereği düzenlenmiş mi ve muhtemelen adın başka bir yerinde mi oluşuyor?
Jacob Vlijm

Ben bir metin dosyasına yönlendiren kaynak klasörleri eğilimindedir, sonra vim kullanın. Kaynak klasörün ilgili bileşenleri doğru sırayla her satır için ikinci bir parametre oluşturmak için bir makro oluşturmak, sonra her satırın başına mv koymak için başka bir makro kullanın. Hatta ben / kayıp klasörleri bir karışıklık yapmak durumunda ilk önce klasör yapısının bir kopyasını almak için gidebiliriz.

Yanıtlar:


16

renamePerl'e erişiminiz olduğunu varsayarsak (genellikle Ubuntu'da bulunur - farkı açıklığa kavuşturan @Serg sayesinde. Şüpheniz varsa arayın /usr/bin/renameve doğru olanı almalısınız), şunları kullanabilirsiniz:

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

-nDizinleri gerçekten yeniden adlandırmak için test ettikten sonra kaldırın . Bu, tüm albümlerin 1000 ila 9999 arasında olduğunu varsayar. Muhtemelen makul ...

açıklama

  • s/old/newyerine oldsahipnew
  • (.*)$1daha sonra başvurmak için istediğiniz sayıda karakteri kaydedin
  • (\d{4})\/$2daha sonra başvurmak üzere satırın sonuna dört hane kaydedin .
  • */ tüm dizinleri eşleştir (dosyalar değil - yardım için muru'ya teşekkürler!)

3
Belki */sadece dizinleri eşleştirmek için yapın.
muru

@muru çalışmıyor gibi görünüyor! Aptalca ne yapıyorum?
17'de Zanna

1
@Zanna, bahsettikleri şey, bazı kabukların mkshyerleşik olarak adlandırılmış olması gerçeğidir rename. Tam yolla değiştirmek veya prenamePerl adını değiştirmek için aramak yeterlidir
Sergiy Kolodyazhnyy

1
@Zanna Bu ilginç biti buldu: unix.stackexchange.com/a/229248/85039 TL; DR : rename"Bazen" olarak adlandırılmıyor prenameama görünüşe göre aynı betiğin iki "dalı", bakımlı değil Debian ve diğeri tarafından. Yani evet . . . bir sürü karışıklık var - bazı kabukların kendi rename, perl paketinin kendi renameve debian'ın kendisi ayrı bir paket sunuyor
Sergiy Kolodyazhnyy

1
@Zanna Programa düşünüyordum olarak anılacaktır rename.uliçinde unix.stackexchange.com/q/229230/21167
Zwol

6

Basit Python betiği bu işi yapabilir:

$ 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

Komut dosyası içeriği:

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

Bu nasıl çalışır:

  • Ana hile, komutları hedeflerin bulunduğu aynı dizinden yürütmemizdir. Ayrıca */betiğe yalnızca dizin olarak bağımsız değişkenler sağlamak için geçeriz
  • Komut dosyası, tüm komut satırı bağımsız değişkenlerini yineleyerek, her dosya adını -karakterdeki dizeler listesine böler . Çıkardığımız parçalardan yeni dosya adı oluşturuldu.
  • move()işlevi shutilsdizinleri aslında yeniden adlandırır işlevi

Kullanımı not: ./rename_dirs.py */

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.