Làm thế nào để đổi tên hàng loạt tệp trong thiết bị đầu cuối macOS?


123

Tôi có một thư mục với một loạt các tệp có tên:

prefix_1234_567.png
prefix_abcd_efg.png

Tôi muốn xóa hàng loạt một gạch dưới và nội dung ở giữa để kết quả đầu ra sẽ là:

prefix_567.png
prefix_efg.png

Có liên quan nhưng không hoàn toàn giải thích:


nhìn vào NSString và NSMutableString của phạm vi và phương pháp substring
Grady chơi

1
Bạn đã xem xét các giải pháp không đầu cuối cho điều này? Quy trình làm việc của Automator có thể thực hiện các loại hoạt động này một cách dễ dàng. Bạn có thể tạo quy trình làm việc tự động hóa để đổi tên tất cả các tệp và thay thế văn bản _*_bằng một khoảng trống.
Mã hóa

Tôi nghĩ rằng hãng tự động không thể làm ký tự đại diện
kidnim

Câu trả lời:


234

Trong trường hợp cụ thể của bạn, bạn có thể sử dụng bashlệnh sau ( bashlà trình bao mặc định trên macOS):

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

Lưu ý: Nếu có khả năng tên tệp của bạn bắt đầu bằng -, hãy đặt -- trước chúng [1]:
mv -- "$f" "${f/_*_/_}"

Lưu ý: echođược bổ sung trước mvđể thực hiện 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 một tập lệnh.

  • "${f/_*_/_}"là một ứng dụng của bash mở rộng tham số : mẫu so khớp chuỗi con (đầu tiên) _*_được thay thế bằng chữ _, cắt hiệu quả mã thông báo giữa khỏi tên.
  • Lưu ý rằng đó _*_là một mẫu (một biểu thức ký tự đại diện, cũng được sử dụng cho dấu chấm tròn), không phải là một biểu thức chính quy (để tìm hiểu về các mẫu, chạy man bashvà tìm kiếm Pattern Matching).

Nếu bạn thấy mình thường xuyên đổi tên hàng loạt tệp, hãy xem xét cài đặt một công cụ chuyên dụng như renametiện ích dựa trên Perl . Trên macOS, bạn có thể cài đặt nó bằng trình quản lý gói phổ biến Homebrew như sau:

brew install rename

Đây là lệnh tương đương với lệnh ở trên cùng bằng cách sử dụng rename:

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

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

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

[1] Mục đích của đối số đặc biệt --, được hỗ trợ bởi hầu hết các tiện ích, là để báo hiệu rằng các đối số tiếp theo phải được coi là toán hạng (giá trị), ngay cả khi chúng trông giống như các tùy chọn bắt đầu bằng -, như Jacob C. lưu ý.


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 thêm 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
Một ví dụ sử dụng thay thế phù hợp ( .*-> $1), ví dụ như Rename Foo bar S01E01 biz baz.extđể S01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
Steve Robbins

2
Yêu thích ý tưởng sử dụng echocho các cuộc chạy khô. Cảm ơn vì tiền hỗ trợ!
James Wright

Thực sự khuyên bạn chỉ nên làmbrew install rename
Chris Redford

98

Để đổi tên tệp, bạn có thể sử dụng renametiệ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 trong thư mục hiện tại:

rename -nvs searchword replaceword *

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

Thêm thông tin: man rename


1
OS Xphiên bản của GNU bash( x86_64-apple-darwin ) không bao gồm tiện ích đổi tên.
Tôi sẽ là

4
Cảm ơn, vâng nó cần phải được cài đặt thông quabrew install rename
David Thomas

2
Mẹo này thật tuyệt vời! Tôi đã nhập rename -vs GLYCOPHORIN GLYCC *và bây giờ nó tự động đổi tên hơn 450 tệp. Và siêu nhanh nữa.
Sander W. van der Laan

3
Thông minh! Thích phần "hiển thị những gì sẽ được thay đổi" TRƯỚC KHI nó thực sự đổi tên mọi thứ!
Ben Duffin

3
Bạn cũng có thể sử dụng regex. đổi tên 's / 123 / onetwothree / g' *
Bryan

12

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

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

kết quả:

prefix_567.png prefix_efg.png

* để chạy khô trước, thay thế mvở cuối bằngecho

Giải trình:

  • e: tùy chọn chỉ 1 lệnh sed.
  • p: để in đầu vào cho sed, trong trường hợp này, nó sẽ là tên tệp gốc trước khi đổi tên
  • @: là một ký tự thay thế / để làm cho sed dễ đọc hơn. Tức là, thay vì sử dụng sed s / search / Replace / g, hãy sử dụng s @ search @ Replace @ g
  • _. *: dấu gạch dưới là ký tự thoát để chỉ '.' thực tế. ký tự không hoặc nhiều lần (trái ngược với BẤT KỲ ký tự nào trong regex)
  • -n2: cho biết có 2 đầu ra cần truyền cho mv làm tham số. đối với mỗi đầu vào từ ls , lệnh sed này sẽ tạo ra 2 đầu ra, sau đó sẽ cung cấp cho mv.

1
Giải pháp thông minh, nếu hơi phức tạp. Việc làm cho điều này trở nên tổng quát hơn, để cũng hỗ trợ các tên tệp có không gian nhúng, thậm chí còn phức tạp hơn: ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'(loại bỏ echođể thực sự đổi tên).
mklement0

2
Bí ẩn? Tôi thích điều này!
Bilal Akil

7

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

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

2

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



1

thử cái 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
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.