Câu trả lời:
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
, CL
thê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 -c
nê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.
Tôi muốn nói đơn giản nhất là chỉ sử dụng rename
lệ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
rename
tồn tại trong tự nhiên. Kiểm tra rename
tài liệu địa phương của bạn để tìm ra cách sử dụng của bạn.
rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
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
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
).
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.
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;
for f in TestSR*.[mh]
, for f in TestSR*.{m,h}
, for f in TestSR*.m TestSR*.h
.
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/) }' *