การเปลี่ยนชื่อไดเรกทอรีจำนวนมากเพื่อย้ายปีตั้งแต่ต้นจนจบ


11

ฉันกำลังดิ้นรนกับโฟลเดอร์เพลงบางโฟลเดอร์ ฉันเคยตัดสินใจตั้งชื่อตามรูปแบบ: artist - album - year. วันนี้ฉันรู้ว่านี่ไม่ใช่การย้ายที่ฉลาดและตอนนี้ต้องการตั้งชื่อไดเรกทอรีของฉันตามรูปแบบ: year - artist - albumเนื่องจากพวกเขาจะปรากฏขึ้นตามลำดับจากน้อยไปมากเมื่อแสดงรายการ

ฉันเริ่มทำการเปลี่ยนชื่อด้วยมือ แต่ด้วยโฟลเดอร์ประมาณ 700 โฟลเดอร์ต้องมีวิธีที่ง่ายกว่า ฉันพยายามใช้gprenameแต่ฉันไม่ค่อยเก่งเรื่อง regex และ bash scripting ...

มีใครบ้างที่สามารถช่วยฉันสำรองปลายนิ้วมือที่ยากจนของฉันได้?

ตัวอย่างบางส่วน:

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)

แก้ไข: ศิลปินบางและอัลบั้มที่ชื่อมีตัวละครพิเศษเช่นหรือAnd.Id Kool & The Gangแม้ว่าทุกไดเรกทอรีจะมี -ตัวคั่น


2
โปรดเพิ่มชื่อไดเรกทอรีตัวอย่างและผลลัพธ์ที่คาดหวัง
muru

ตัวอย่างเช่น: ฉันมี "Aes Dana - Memory Shell - 2004" และฉันต้องการได้ "2004 - Aes Dana - Memory Shell"
TazMayhem

1
คุณรู้วิธีแก้ไขคำถามดังนั้นทำไมคุณไม่เพิ่มคำถามนั้นลงไป นอกจากนี้อัลบั้มหรือชื่อศิลปินมี-อยู่ในนั้นบ้างไหม?
muru

ชื่อจัดเรียงโดยตัวคั่น "-" ตามคำจำกัดความและอาจเกิดขึ้นที่อื่นในชื่อหรือไม่?
Jacob Vlijm

ฉันมักจะ ls โฟลเดอร์ต้นทางเปลี่ยนเส้นทางไปยังไฟล์ข้อความแล้วใช้เสียงเรียกเข้า ฉันสร้างแมโครเพื่อสร้างพารามิเตอร์ที่สองสำหรับแต่ละบรรทัดด้วยส่วนประกอบที่เกี่ยวข้องของโฟลเดอร์ต้นทางในลำดับที่ถูกต้องจากนั้นใช้แมโครอื่นเพื่อวาง mv ที่จุดเริ่มต้นของแต่ละบรรทัด ฉันอาจไปไกลถึงขนาดคัดลอกโครงสร้างโฟลเดอร์เสียก่อนในกรณีที่ฉันทำโฟลเดอร์ยุ่งเหยิง / สูญหาย

คำตอบ:


16

สมมติว่าคุณสามารถเข้าถึง perl rename(โดยทั่วไปจะมีใน Ubuntu - ขอบคุณ @Serg สำหรับการชี้แจงความแตกต่างหากสงสัยโทร/usr/bin/renameและคุณควรได้รับสิทธิ) คุณสามารถใช้:

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

ลบ-nหลังจากการทดสอบเพื่อเปลี่ยนชื่อไดเรกทอรีจริง นี่จะถือว่าวันที่อัลบั้มทั้งหมดระหว่าง 1,000 ถึง 9999 อาจจะสมเหตุสมผล ...

คำอธิบาย

  • s/old/newแทนที่oldด้วยnew
  • (.*)บันทึกจำนวนอักขระใด ๆ ไว้อ้างอิงใน$1ภายหลัง
  • (\d{4})\/บันทึกตัวเลขสี่หลักที่ท้ายบรรทัดเพื่ออ้างอิงใน$2ภายหลัง
  • */ ตรงกับไดเรกทอรีทั้งหมด (ไม่ใช่ไฟล์ - ขอบคุณ @muru สำหรับความช่วยเหลือ!)

3
อาจทำ*/เพื่อจับคู่ไดเรกทอรีเท่านั้น
muru

@muru ดูเหมือนว่าจะไม่ทำงาน! ฉันกำลังทำอะไรโง่ ๆ
Zanna

1
@Zanna ฉันบางสิ่งที่พวกเขาหมายถึงความจริงที่ว่าเปลือกหอยบางคนชอบที่มีในตัวเรียกว่าmksh renameมันก็เพียงพอแล้วที่จะแทนที่ด้วยเส้นทางแบบเต็มหรือเรียกprenameให้เปลี่ยนชื่อ Perl
Sergiy Kolodyazhnyy

1
@Zanna พบบิตที่น่าสนใจนี้: unix.stackexchange.com/a/229248/85039 TL; DR : renameไม่ใช่ "บางครั้งเรียกว่าprename" แต่เห็นได้ชัดว่าพวกเขากำลังสอง "กิ่ง" ของสคริปต์เดียวกันซึ่งไม่ได้รับการบำรุงรักษา โดย Debian และอีกอันคือ ใช่แล้ว . . มันยุ่งเหยิงไปหมด - กระสุนบางตัวมีของตัวเองrename, เพอร์ลแพคเกจมีของมันเองrename, และเดเบียนเองก็จัดแพ็คเกจแยกต่างหาก
Sergiy Kolodyazhnyy

1
@Zanna ฉันกำลังคิดเกี่ยวกับโปรแกรมที่เรียกว่าเป็นrename.ulในunix.stackexchange.com/q/229230/21167
zwol

6

Simple Python script สามารถทำงานดังกล่าวได้:

$ 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 */

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.