Đổi tên tệp bằng lệnh một dòng


10

Tôi có thư mục này và muốn đổi tên các tệp:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Kết quả sẽ như thế này:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Tôi muốn giải quyết điều này với các công cụ shell phổ biến.


1
Tôi muốn giải quyết điều này với các công cụ shell phổ biến. Tôi không nói rằng bạn không có lý do chính đáng, nhưng tôi tin rằng bạn đã hỏi và trả lời một câu hỏi cho chính mình "tại sao?". Lần trước tôi có một vấn đề rất giống để giải quyết, tôi lập tức đẩy Bash sang một bên và giải quyết nó bằng Python. Dễ dàng hơn nhiều (nhưng tôi đã biết Python, các phương thức chuỗi, global.glob và os.rename - và tôi cũng phải tìm lại một cây chứa đầy tên thư mục với khoảng trắng và các ký tự lúng túng khác, không ai trong số chúng là nguyên nhân của thêm phiền nếu sử dụng Python)
nigel222

1
@ nigel222 Tôi lười biếng và tôi muốn gõ càng ít ký tự càng tốt. Đó là lý do tại sao tôi không muốn sử dụng trăn ở đây. Đừng hiểu lầm tôi. Cho đến nay Python là ngôn ngữ lập trình ưa thích của tôi và sử dụng nó hàng ngày.
guettli

Câu trả lời:


18

Bạn có thể sử dụng rename...

rename -n 's/^[0-9]+ - //' *

Xóa -nsau khi kiểm tra để thực sự đổi tên các tệp

Giải trình

  • s/old/new/thay thế oldbằngnew
  • ^ bắt đầu chuỗi
  • [0-9]+ một số số

loại hoa regex nào được renamecông cụ hỗ trợ . Nó có sử dụng PCRE không? ... sẽ rất tuyệt.
guettli

5
@guettli nói đúng, không phải là PCRE (đó là biểu thức chính quy tương thích Perl ). Đây renamelà một tập lệnh Perl để nó có hỗ trợ biểu thức chính quy Perl đầy đủ; PCRE chỉ là một tập hợp con của điều đó. Tuy nhiên, bất cứ điều gì bạn biết từ PCRE sẽ được áp dụng rename.
terdon

@terdon Tôi không quan tâm đến việc thực hiện. Nếu bạn nhìn nó bằng kính toán học, thì renamecó biểu thức chính quy tương thích perl. Có, việc thực hiện pcre không được sử dụng. Tôi hiểu điều này :-) Cảm ơn bạn đã trả lời nhanh chóng.
guettli

9

bash mở rộng tham số để loại bỏ phần cần thiết từ đầu:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Hình thức mở rộng:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echodành cho chạy khô; loại bỏ nó cho hành động thực tế:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Thí dụ:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

Vâng, làm việc. Cảm ơn bạn. Vì tôi biết biểu thức chính quy tương thích perl từ Python (mà tôi sử dụng hàng ngày), tôi thích renamelệnh này hơn. (Ít gõ hơn).
guettli

1
@guettli renamelà con đường để đi nếu bạn đã quen thuộc với PCRE; các renamecâu trả lời đã được đưa ra để phải di chuyển với tinh khiết bash. Chỉ cần lưu ý, python's re(hoặc regex) Module này là không hoàn toàn tương thích PCRE BTW.
heemayl

@guettli Bạn cũng vừa hạ thấp câu trả lời của tôi? : O
heemayl

Có tôi đã làm, và tôi nêu lên nhận xét của bạn. Tôi hy vọng bạn không nhận nó cá nhân. Đừng hiểu lầm tôi, nhưng ý kiến ​​cá nhân của tôi là điều này ${f#[[:digit:]]*-[[:blank:]]}thật xấu xí. Có nó hoạt động. Nhưng chúng ta sống trong 21 tuổi. Tôi nghĩ rằng đã đến lúc chuyển từ "nó hoạt động" sang "thật dễ dàng và thú vị". Nếu "nó hoạt động" là mục tiêu, thì linux sẽ không bao giờ đánh mất định kiến ​​về việc không thân thiện với người dùng. Vì bạn đã có rất nhiều phiếu bầu, nên phiếu bầu này không bị tổn thương (tôi hy vọng). Nếu có, hãy nói với tôi, và tôi sẽ lấy lại.
guettli

1
@guettli Bất cứ điều gì phù hợp với bạn. Ở đây: gnu.org/software/bash/manual/html_node/ Từ Chỉ cần lưu ý, lớp nhân vật [[:digit:]][[:blank:]]ở đó để tuân thủ locale, bạn cũng khá phổ biến trong Regex.
heemayl
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.