Tôi sẽ đề xuất ba phương án. Mỗi lệnh là một dòng đơn giản, nhưng tôi sẽ cung cấp các biến thể cho các trường hợp phức tạp hơn, chủ yếu trong trường hợp các tệp cần xử lý được trộn với các tệp khác trong cùng một lệnh.
mmv
Tôi sẽ sử dụng lệnh mmv
từ gói cùng tên :
mmv '*HBO_DPM*' '#1dpm#2'
Lưu ý rằng các đối số được truyền dưới dạng chuỗi, vì vậy việc mở rộng toàn cục không xảy ra trong trình bao. Lệnh nhận chính xác hai đối số và sau đó tìm các tệp tương ứng bên trong, không giới hạn chặt chẽ về số lượng tệp. Cũng lưu ý rằng lệnh trên giả định rằng tất cả các tệp khớp với quả cầu đầu tiên sẽ được đổi tên. Tất nhiên bạn được tự do cụ thể hơn:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Nếu bạn có các tệp nằm ngoài phạm vi số được yêu cầu trong cùng thư mục, bạn có thể tốt hơn với vòng lặp trên các số được đưa ra trong câu trả lời này. Tuy nhiên, bạn cũng có thể sử dụng một chuỗi các lệnh gọi mmv với các mẫu phù hợp:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
lặp qua số
Nếu bạn muốn tránh cài đặt bất cứ thứ gì, hoặc cần chọn theo phạm vi số tránh các kết quả khớp ngoài phạm vi này và bạn đã sẵn sàng chờ 74.023 lệnh, bạn có thể sử dụng vòng lặp bash đơn giản:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Điều này đặc biệt tốt ở đây vì không có khoảng trống trong trình tự. Nếu không, bạn có thể muốn kiểm tra xem tập tin nguồn có thực sự tồn tại không.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Lưu ý rằng trái ngược với for ((i=89000; i<=163022; ++i))
việc mở rộng cú đúp xử lý các số 0 hàng đầu kể từ khi một số Bash phát hành vài năm trước. Trên thực tế, một thay đổi tôi đã yêu cầu, vì vậy tôi rất vui khi thấy các trường hợp sử dụng cho nó.
Đọc thêm: Mở rộng cú đúp trong các trang thông tin Bash, đặc biệt là phần về {x..y[..incr]}
.
lặp qua các tập tin
Một lựa chọn khác sẽ là lặp qua một quả cầu phù hợp, thay vì chỉ lặp qua phạm vi số nguyên trong câu hỏi. Một cái gì đó như thế này:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Một lần nữa, đây là một mv
lời mời cho mỗi tệp. Và một lần nữa, vòng lặp có một danh sách dài các phần tử, nhưng toàn bộ danh sách không được chuyển thành đối số cho một quy trình con, mà được xử lý bên trong bằng bash, vì vậy giới hạn sẽ không gây ra vấn đề cho bạn.
Đọc thêm: Mở rộng tham số Shell trong các trang thông tin Bash, tài liệu ${parameter/pattern/string}
giữa những người khác.
Nếu bạn muốn giới hạn phạm vi số cho phạm vi bạn cung cấp, bạn có thể thêm một kiểm tra cho điều đó:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
Ở đây ${i##pattern}
loại bỏ các khớp tiền tố dài nhất pattern
từ $i
. Tiền tố dài nhất đó được định nghĩa là bất cứ thứ gì, sau đó là dấu gạch dưới, sau đó là 0 hoặc nhiều số không. Cái sau được viết như *(0)
là một mẫu hình cầu mở rộng phụ thuộc vào extglob
tùy chọn được đặt. Xóa các số 0 đứng đầu rất quan trọng để coi số là cơ sở 10 chứ không phải cơ sở 8. Đối số +([0-9])
trong vòng lặp là một quả cầu mở rộng khác, khớp với một hoặc nhiều chữ số, chỉ trong trường hợp bạn có các tệp bắt đầu giống nhau nhưng không kết thúc bằng một con số.
ARG_MAX
giới hạn của trình bao . Vì câu hỏi này yêu cầu một giải pháp dòng lệnh rõ ràng, các giải pháp GUI (có thể bằng nhau) như trong câu hỏi khác cũng không khớp.