Câu trả lời:
Bạn không nên sử dụng renameđể đổi tên chỉ một tệp, thay vào đó , hãy sử dụng mv(1) .
Hơn nữa, để thoát khỏi whitepsace, hãy thêm tiền tố vào \:
"Ubuntu One" → Ubuntu\ One
Lệnh của bạn sẽ là
mv bla\ bla.txt blabla.txt
dấu gạch chéo ngược cho bash rằng ký tự tiếp theo bằng cách nào đó đặc biệt, ví dụ như \a'chuông', \cho một không gian theo nghĩa đen và v.v.
xem man ascii(7) để biết thêm
Ngoài ra, vì bạn hiện đang sử dụng lệnh chính xác mv, bạn có thể trích dẫn tên tệp nếu có nhiều khoảng trắng:
mv "bla bla.txt" blabla.txt
(Điều này sẽ bla\ \ \ \ bla.txtở dạng thoát)
Trong bash, các chuỗi được trích dẫn (dấu ngoặc đơn hoặc dấu ngoặc kép) được coi là một đối số, trong khi các chuỗi không trích dẫn sẽ được chia thành nhiều đối số, như sau:
["mv", "bla", "bla.txt", "blabla.txt", ]và mvmong đợi:
["mv", "source", "destination", ]Lưu ý: nhập 'mv' và một vài ký tự đầu tiên của tên tệp và nhấn TABsẽ cung cấp cho bạn phiên bản thoát của tên tệp, giúp việc đổi tên nhanh chóng và dễ dàng.
renameđược sử dụng để xử lý hàng loạt việc đổi tên tệp bằng biểu thức chính quy, như được minh họa trong ví dụ từ trang man của nó :
rename 's/\.bak$//' *.bak
Để loại bỏ bất kỳ sự xuất hiện nào của .bak (ở cuối chuỗi [$]) khỏi tất cả các tệp khớp với "* .bak".
đổi tên là lệnh chuyên biệt để đổi tên hàng loạt. Vô tình, cái mà chúng ta thường gọi là "đổi tên" thực sự là "chuyển" sang một tên mới:
mv 'bla bla .txt' blabla.txt
A=bla ; mv "$A $A .txt" blabla.txtsẽ di chuyển bla bla .txt, nhưng A=bla ; mv '$A $A .txt' blabla.txtsẽ tìm một tệp thực sự có tên "$ A $ A .txt". Một trong hai sẽ làm việc cho ví dụ của bạn mặc dù.
rename "s/\s//g" "bla bla.txt"
s là lệnh sed Thay thế.
\ s là dành cho WhiteSpace
Bạn đang thay thế không có gì. Chuỗi thay thế khác đi sau dấu gạch chéo thứ hai.
g là dành cho Toàn cầu, tức là thay thế mọi trường hợp. Bỏ qua g chỉ thay thế phiên bản đầu tiên.
Lệnh này sẽ thay thế khoảng trắng bằng dấu gạch dưới trong tất cả các tệp:
rename "s/\s/_/g" *