Đổi tên hàng loạt, thay đổi tiền tố


53

Làm cách nào tôi có thể thay thế hàng loạt tiền tố cho nhiều tệp?

Tôi có rất nhiều tập tin như

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Tôi muốn thay đổi tất cả chúng thành

  • CLConnectionContext.h
  • CLConnectionContext.m

Làm thế nào tôi có thể làm điều này?

Câu trả lời:


38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

Điều này sử dụng thay thế lệnh bash để loại bỏ 6 ký tự đầu tiên khỏi tên tệp đầu vào thông qua cut, CLthêm vào kết quả và lưu trữ trong đó $newname. Sau đó, nó đổi tên cũ thành tên mới. Điều này được thực hiện trên mỗi tập tin.

cut -c7-xác định rằng chỉ các ký tự sau chỉ mục 7 phải được trả về từ đầu vào. 7-là một phạm vi bắt đầu từ chỉ số 7 không có kết thúc; nghĩa là cho đến cuối dòng.

Trước đây, tôi đã sử dụng cut -b7-, nhưng -cnên được sử dụng thay thế để xử lý các mã hóa ký tự có thể có nhiều byte cho mỗi ký tự, như UTF-8.


Thx, tôi cũng nhận được điều này ngay bây giờ. Đánh dấu là câu trả lời. Thx
ErikTJ

Điều này hoạt động độc đáo, cảm ơn. Bạn có thể giải thích những gì -b7- không? Đây có phải là tham chiếu đến danh sách byte? ss64.com/bash/cut.html
bắt đầu từ

@imjared Cập nhật câu trả lời với nhiều chi tiết hơn.
mrb

56

Tôi muốn nói đơn giản nhất là chỉ sử dụng renamelệnh phổ biến trên nhiều bản phân phối Linux. Có hai phiên bản phổ biến của lệnh này, vì vậy hãy kiểm tra trang man của nó để tìm xem bạn có cái nào:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

Nếu bạn muốn sử dụng phiên bản từ produc-linux-ng trong hệ thống Debian, thì nó có sẵn dưới tên rename.ul


7
Một cảnh báo: nhiều phiên bản renametồn tại trong tự nhiên. Kiểm tra renametài liệu địa phương của bạn để tìm ra cách sử dụng của bạn.
jw013

Để xóa bí danhrename TestSR '' *
Bsienn

hmm ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder

32

Mở rộng tham số Shell là đủ cho các phép biến đổi đơn giản như thế này. Thay thế lệnh kém hiệu quả hơn do cần phải sinh ra các quá trình bổ sung (đối với chính lệnh thay thế và cut/ sed).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

Giải thích: TestSR*tìm các tập tin, CL${f#TestSR}sẽ là tên mới. Các công cụ sau #sẽ được thay thế từ tên tệp ( f).
Joe Eifert

4

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

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> Tìm tất cả các tệp có đuôi .h hoặc .m
  • n=CL -> Thêm tiền tố CL vào tên tệp
  • sed -e 's/^Test//' -> Xóa tiền tố kiểm tra khỏi tên tệp
  • mv $a $n -> Thực hiện đổi tên

3

Bạn có thể thử với:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

Xem man bash(phần "Mở rộng tham số") để biết chi tiết.


1

Chà, nó không khó như tôi đâu.

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;

1
Trong trường hợp nó giúp ích cho tương lai, bạn không phải lặp lại các lệnh cho hai mẫu của bạn; bạn có thể sử dụng (ví dụ): for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb

1

Nếu bạn cần một cái gì đó liên tục hơn, bạn có thể làm điều này

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
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.