Đừng phân tích tên tập tin với sed
! Đầu ra của echo "$file"
có thể không đáng tin cậy.
Sử dụng rename
. Vào ngày 17.10, bạn cần cài đặt nó trước
sudo apt install rename
Sau đó:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Ghi chú
- loại bỏ
-n
sau khi thử nghiệm để thực sự đổi tên các tập tin
--
tùy chọn kết thúc trong trường hợp bất kỳ tệp nào bắt đầu bằng -
[^-A-Za-z0-9_ .]
các ký tự chúng tôi không muốn thay thế - đặt -
đầu tiên hoặc cuối cùng để nó không thể chỉ ra một phạm vi (nó được xử lý theo nghĩa đen ở các vị trí này).
- Không gian có thể được bao gồm trong lớp
.
được xử lý theo nghĩa đen (trong bối cảnh regex khác, nó đại diện cho bất kỳ nhân vật nào và cần phải thoát ra).
Điều này cũng hoạt động trong sed
:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Nếu tôi thêm một khoảng trắng vào cuối phiên bản của bạn, tôi sẽ gặp lỗi:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
Nhưng -
cuối cùng, nó hoạt động:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
Vì vậy, có lẽ vị trí của dấu gạch nối gây ra vấn đề của bạn khi bạn thêm khoảng trắng. Nhưng lời khuyên không nên phân tích tên tập tin đứng!