Đổi tên hàng loạt để chuyển năm từ đầu đến đầu


11

Tôi hiện đang vật lộn với một số thư mục âm nhạc. Tôi đã từng quyết định đặt tên cho chúng theo mẫu : artist - album - year. Hôm nay tôi nhận ra rằng đây không phải là một bước đi thông minh và bây giờ muốn đặt tên cho các thư mục của tôi theo mẫu: year - artist - albumvì sau đó chúng sẽ hiển thị theo thứ tự tăng dần khi được liệt kê.

Tôi bắt đầu thực hiện việc đổi tên bằng tay, nhưng với khoảng 700 thư mục, phải có một cách đơn giản hơn; Tôi đã thử sử dụng gprenamenhưng tôi không giỏi về regex và bash scripting ...

Có ai có thể giúp tôi tha thứ cho những ngón tay tội nghiệp của tôi không?

Vài ví dụ:

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

sẽ trở thành

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

EDIT: Một số tên nghệ sĩ và album có các ký tự đặc biệt như And.Idhoặc Kool & The Gang. Mặc dù mỗi thư mục có -dấu phân cách.


2
Vui lòng thêm một số tên thư mục ví dụ và đầu ra dự kiến.
muru

Ví dụ: Tôi có "Aes Dana - Memory Shell - 2004" và tôi muốn có "2004 - Aes Dana - Memory Shell"
TazMayhem

1
Bạn có biết cách chỉnh sửa câu hỏi, vậy tại sao bạn không thêm câu hỏi đó vào câu hỏi? Ngoài ra, có bất kỳ tên album hoặc nghệ sĩ có -trong đó?
muru

Là tên được sắp xếp bởi dấu phân cách "-" theo định nghĩa, và nó có thể xảy ra ở nơi khác trong tên không?
Jacob Vlijm

Tôi có xu hướng ls các thư mục nguồn chuyển hướng đến một tệp văn bản, sau đó sử dụng vim. Tôi tạo một macro để tạo một tham số thứ hai cho mỗi dòng với các thành phần có liên quan của thư mục nguồn theo đúng thứ tự, sau đó sử dụng một macro khác để đặt mv ở đầu mỗi dòng. Tôi thậm chí có thể đi xa đến mức lấy một bản sao cấu trúc thư mục trong trường hợp tôi tạo ra một mớ hỗn độn các thư mục.

Câu trả lời:


16

Giả sử bạn có quyền truy cập vào perl rename(thường có sẵn trong Ubuntu - cảm ơn @Serg vì đã làm rõ sự khác biệt. Nếu nghi ngờ, hãy gọi /usr/bin/renamevà bạn sẽ nhận được đúng), bạn có thể sử dụng:

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

Loại bỏ -nsau khi thử nghiệm để thực sự đổi tên các thư mục. Điều này giả định tất cả các album ngày từ 1000 đến 9999. Có lẽ hợp lý ...

Giải trình

  • s/old/newthay thế oldbằngnew
  • (.*)lưu bất kỳ số lượng của bất kỳ ký tự để tham khảo như $1sau
  • (\d{4})\/lưu bốn chữ số ở cuối dòng để tham khảo như $2sau.
  • */ phù hợp với tất cả các thư mục (không phải tệp - nhờ @muru giúp đỡ!)

3
Có lẽ làm */để chỉ phù hợp với thư mục.
muru

@muru có vẻ không hoạt động! Tôi đang làm gì ngu ngốc?
Zanna

1
@Zanna tôi làm mỏng những gì họ đề cập đến là thực tế là một số shell như mkshđược tích hợp sẵn rename. Nó là đủ để thay thế nó bằng đường dẫn đầy đủ hoặc gọi prenameđể gọi đổi tên Perl
Sergiy Kolodyazhnyy

1
@Zanna Tìm thấy bit thú vị này: unix.stackexchange.com/a/229248/85039 TL; DR : renameKhông "đôi khi được gọi prename" nhưng dường như chúng là hai "nhánh" của cùng một tập lệnh, một tập lệnh không được duy trì bởi Debian, và một cái khác nữa. Vì vậy, vâng. . . đó là cả một mớ hỗn độn - một số vỏ có renamegói riêng , perl có gói riêng renamevà debian cung cấp gói riêng
Sergiy Kolodyazhnyy

1
@Zanna Tôi đã nghĩ đến chương trình được gọi là rename.ultrong unix.stackexchange.com/q/229230/21167
zwol

6

Kịch bản Python đơn giản có thể thực hiện công việc đó:

$ 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

Nội dung kịch bản:

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

Cách thức hoạt động:

  • Thủ thuật chính là chúng ta thực thi tập lệnh từ cùng một thư mục nơi các mục tiêu cư trú. Chúng tôi cũng vượt qua */để chỉ cung cấp các thư mục làm đối số cho tập lệnh
  • Kịch bản lặp lại trên tất cả các đối số dòng lệnh, chia nhỏ từng tên tệp thành danh sách các chuỗi tại -ký tự. Tên tệp mới được xây dựng từ các phần chúng tôi trích xuất.
  • move()chức năng từ shutilsmô-đun là những gì thực sự đổi tên các thư mục

Lưu ý cách sử dụng: ./rename_dirs.py */

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.