2014-06-08 20 views
79

tôi có một thư mục với một loạt các tập tin có tên:mac os x loạt thiết bị đầu cuối đổi tên

prefix_1234_567.png 
prefix_abcd_efg.png 

tôi muốn hàng loạt loại bỏ một dấu gạch dưới và hàm lượng trung nên sản lượng sẽ là

prefix_567.png 
prefix_efg.png 

nhờ có liên quan nhưng không hoàn toàn giải thích: how can I batch rename files using the Terminal? Regex to batch rename files in OS X Terminal

+0

nhìn vào NSString và NSMutableString của phương pháp phạm vi và chuỗi –

+1

bạn đã xem xét các giải pháp phi terminal này? Một quy trình làm việc của Automator có thể thực hiện các thao tác này một cách dễ dàng. Bạn có thể tạo quy trình làm việc của trình tự động để đổi tên tất cả các tệp và thay thế văn bản bằng '_ * _' bằng dấu trống. – Encryptic

+0

tôi nghĩ rằng automator không thể làm ký tự đại diện – kidnim

Trả lời

163

Trong trường hợp cụ thể của bạn, bạn có thể sử dụng lệnh sau đây bash (bash là vỏ mặc định trên hệ điều hành MacOS):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done 

Lưu ý: echo được thêm vào phía trước mv để thực hiện một chạy khô. Xóa nó để thực hiện đổi tên thực tế.

Bạn có thể chạy nó từ dòng lệnh hoặc sử dụng nó trong tập lệnh.

  • "${f/_*_/_}" là một ứng dụng của bashparameter expansion: (đầu tiên) phù hợp với chuỗi mẫu _*_ được thay thế bằng nghĩa đen _, cắt hiệu quả token giữa từ tên.
  • Lưu ý rằng _*_ là một mô hình (một biểu thức ký tự đại diện, cũng như sử dụng cho globbing), không phải là một biểu thức chính quy (để tìm hiểu về mô hình, chạy man bash và tìm kiếm Pattern Matching).

Nếu bạn thấy mình tập tin batch-đổi tên thường xuyên, hãy xem xét một công cụ chuyên dùng như Perl dựa trên rename utility. Ngày OSX bạn có thể cài đặt nó sử dụng phổ biến quản lý gói Homebrew như sau: brew install rename

Dưới đây là các lệnh tương đương sử dụng rename:

rename -n -e 's/_.*_/_/' *.png 

Một lần nữa, lệnh này thực hiện một chạy khô; xóa -n để thực hiện đổi tên thực tế.

  • Tương tự như các giải pháp bash, s/.../.../ thực hiện thay văn bản, nhưng - không giống như trong bash - đúng biểu thức thông thường được sử dụng.
+3

câu trả lời tuyệt vời, hoạt động hoàn hảo. tôi cũng đánh giá cao rằng bạn đã quay lại và chỉnh sửa nó để giải thích nó nhiều hơn và cung cấp một giải pháp thanh lịch hơn nếu tôi lặp lại điều này. một lần nữa, cảm ơn rất nhiều, rất hữu ích – kidnim

+4

Ví dụ sử dụng các thay thế trùng khớp ('. *' -> '$ 1'), ví dụ: Đổi tên 'Foo bar S01E01 biz baz.ext' thành' S01E01.ext': 'rename -n -e 's /.* (S [0-9] {2} E [0-9] {2}). * (\. [az] {2,4})/$ 1 $ 2/'* ' –

9

Bạn có thể sử dụng sed:

ls * | sed -e 'p;[email protected]_.*[email protected][email protected]' | xargs -n2 mv 

kết quả:

prefix_567.png prefix_efg.png 

* để làm khô-chạy đầu tiên, thay thế mv ở cuối với echo

+1

Thông minh, nếu giải pháp hơi phức tạp. Làm điều này tổng quát hơn, để cũng hỗ trợ tên tập tin với không gian nhúng, thậm chí còn phức tạp hơn: 'ls * | xargs -I% bash -c 'echo mv "%" "$ (của sed' s @ _. * _ @ _ @ '<<<"% ")"' '(xoá' echo' để thực sự đổi tên). – mklement0

+2

Arcane? Tôi thích điều này! –

6

Tôi đã có một hàng loạt các tệp trông như thế này: be90-01.png và cần phải thay đổi dấu gạch ngang thành dấu gạch dưới. Tôi sử dụng này, mà làm việc tốt:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done 
72

Để đổi tên tập tin, bạn có thể sử dụng rename tiện ích:

brew install rename

Ví dụ, để thay đổi một chuỗi tìm kiếm trong tất cả các tên tập tin trong thư mục hiện hành:

rename -nvs searchword replaceword * 

Xóa tham số 'n' để áp dụng thay đổi. Thông tin

thêm: man rename

+0

Các phiên bản 'OS X' của' GNU bash' (* x86_64-apple-darwin *) không bao gồm tiện ích đổi tên. –

+4

Cảm ơn, có nó cần phải được cài đặt thông qua 'brew install rename' –

+1

Mẹo này thật tuyệt vời! Tôi đã gõ 'rename -vs GLYCOPHORIN GLYCC *' và bây giờ nó sẽ tự động đổi tên hơn 450 file. Và siêu nhanh quá. –

2

bạn có thể cài đặt rename lệnh bằng cách sử dụng brew. chỉ cần làm brew install rename và sử dụng nó.

1

Sử dụng mmv

mmv '*_*_*' '#1_#3' *.png 
+0

-bash: mmv: không tìm thấy lệnh – commonpike

+0

bạn cần cài đặt 'sudo apt-get install mmv' trước tiên. –

+0

Vì đây là OS X, thủ tục cài đặt chính xác là 'brew install mmv'. – jpj

1

thử này

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done 

Đây là một cách khác:

for file in Name*.png; do mv "$file" "01_$file"; done 
Các vấn đề liên quan