Theo dõi câu hỏi trước đây của tôi , nếu tôi có nhiều tệp có dạng
sw.ras.001
sw.ras.002
sw.ras.003
…
Tôi có thể sử dụng lệnh nào để loại bỏ ras.
phần giữa của tất cả các tệp?
\.
trong các mẫu.
Theo dõi câu hỏi trước đây của tôi , nếu tôi có nhiều tệp có dạng
sw.ras.001
sw.ras.002
sw.ras.003
…
Tôi có thể sử dụng lệnh nào để loại bỏ ras.
phần giữa của tất cả các tệp?
\.
trong các mẫu.
Câu trả lời:
Bạn có thể làm điều này với một sửa đổi khá nhỏ của một trong hai câu trả lời từ câu hỏi cuối cùng:
rename s/ras\.// sw.ras.*
hoặc là
for file in sw.ras.*; do
mv "$file" "${file/ras./}"
done
Giải trình:
rename
là một perl
tập lệnh lấy một perl
biểu thức chính quy và một danh sách các tệp, lần lượt áp dụng biểu thức chính quy cho tên của từng tệp và đổi tên từng tệp thành kết quả của việc áp dụng biểu thức chính quy. Trong trường hợp của chúng tôi, ras
được khớp theo nghĩa đen và \.
khớp với nghĩa đen .
(như .
một mình chỉ ra bất kỳ ký tự nào ngoài dòng mới) và nó thay thế bằng không có gì.
Các for
vòng lặp mất tất cả các file bắt đầu bằng sw.ras.
(tiêu chuẩn vỏ glob) và vòng qua chúng. ${var/search/replace}
tìm kiếm $var
cho search
và thay thế sự xuất hiện đầu tiên với replace
, vì vậy ${file/ras./}
lợi nhuận $file
với người đầu tiên ras.
bị loại bỏ. Do đó, lệnh đổi tên tệp thành cùng tên trừ ras.
. Lưu ý rằng với tìm kiếm và thay thế này, .
được thực hiện theo nghĩa đen, không phải là một ký tự đặc biệt.
Một tùy chọn khác là sử dụng mmv (Mass MoVe và đổi tên):
mmv '*ras.*' '#1#2'
Đừng quên sử dụng các trích dẫn duy nhất xung quanh các mẫu của bạn, nếu không các ngôi sao sẽ được mở rộng ở cấp độ vỏ.
Tiện ích không phải lúc nào cũng có sẵn nhưng nếu không có, bạn có thể cài đặt nó với:
sudo apt-get install mmv
Xem trang người đàn ông ở đây .
Trong bất kỳ vỏ POSIX-compliant ( bash
, dash
, ksh
, vv):
for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
mv "${file}" "${file/ras\./}"
done
Hoặc với rename
:
rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Gần đây tôi đã phải đổi tên hàng loạt một số tệp mà tôi phải thay thế lần xuất hiện cuối cùng của một nhân vật trong đó nhân vật xảy ra nhiều lần trong tên tệp. Trong trường hợp cụ thể này, tôi đã phải thay thế dấu gạch ngang cuối cùng bằng dấu gạch -
dưới _
, biến điều này:
some-long-file-name.ext
vào đây:
some-long-file_name.ext
Phải mất một thời gian nhưng điều này cuối cùng đã làm được:
for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done
Đây:
${i%-*}
khớp với sự khởi đầu của tên tệp cho đến lần xuất hiện cuối cùng của dấu gạch ngang -
${file##*-}
khớp với phần còn lại của tên tệp sau lần xuất hiện cuối cùng của dấu gạch ngang -
ras
, tức là kết thúc vớisw..001
, hoặcras.
, để lạisw.001
?