Đổi tên tập tin có dấu ngoặc kép 'trong tên của nó


11

Tôi có một chút vấn đề. Một khách hàng giao nhiệm vụ cho tôi di chuyển các trang web từ một máy chủ thực sự cũ. Không biết làm thế nào họ đến đó, nhưng có những tập tin với 'tên của họ. Có cách nào để đổi tên tập tin không? mvDường như không làm được điều đó.

ls cho thấy nó như 90843_O\\'ConnorPaul_GeneralManager.jpg

Khi tôi cố gắng

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

nó không làm gì với >dòng mới như thể chờ thêm đầu vào.

Nếu tôi cố gắng

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

Tôi nhận được lỗi

mv: could stat '90843_O \' ConnorPaul_GeneralManager.jpg ': Không có tệp hoặc thư mục như vậy

Ngoài ra, là có cách đơn giản để thay đổi \'để _trong tất cả các file trong thư mục nhất định?


1
Nếu bạn có nhiều hơn , đó vidirlà một giải pháp đơn giản cho các loại vấn đề này.
derobert

Câu trả lời:


6

Hoàn thành tab Bash sẽ có thể thực hiện đúng ở đây nếu bạn chỉ cần gõ mv 90843_Ovà nhấn tab. Mặt khác, một cách để thoát tên đúng là:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

Các dấu ngoặc kép loại bỏ sự cần thiết để thoát khỏi ', nhưng hai ký tự dấu gạch chéo ngược vẫn cần phải được thoát (một dấu gạch chéo ngược thêm cho mỗi dấu ngoặc kép tạo ra bốn dấu gạch chéo ngược). Một lựa chọn khác là:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

Ở đây việc đặt dấu gạch chéo ngược trong dấu ngoặc đơn sẽ loại bỏ sự cần thiết phải thoát chúng, nhưng bạn cần kết thúc dấu ngoặc đơn để thêm một chữ '. Điều này được thoát ra sau khi trích dẫn kết thúc.

Lưu ý vấn đề ở đây là có liên quan nhiều đến việc có dấu gạch chéo ngược trong tên như trích dẫn đơn. Để thay thế \\'chuỗi (vì có hai dấu gạch chéo ngược trong tên tệp trong câu hỏi, cả hai sẽ gây ra sự cố) với dấu gạch dưới cho tất cả các tệp trong một thư mục bằng vòng lặp:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

Các -isẽ làm cho mvkịp thời nếu có tập tin sẽ được ghi đè. Sử dụng prename( renameliên kết đến điều này trên nhiều hệ thống):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Hủy bỏ -nkhi bạn hạnh phúc nó đang làm những gì bạn muốn. Lưu ý rằng các ký tự dấu gạch chéo ngược phải được thoát bên trong biểu thức perl ở đây, mặc dù có các dấu ngoặc đơn xung quanh chúng (không có dấu ngoặc đơn bạn sẽ cần tám dấu gạch chéo ngược vì bốn dấu ngoặc sẽ bị xóa bởi shell và không phải là một phần của biểu thức perl).


4

Bạn có thể sử dụng renamecho các nhiệm vụ như vậy:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Nếu bạn muốn thay thế 'cho _bạn cũng có thể sử dụng đổi tên:

rename "s/\'/_/g" *

-2

Grrr, @Graeme đã đánh bại tôi, nhưng dù sao tôi cũng sẽ đăng ...

Nếu bạn trích dẫn tên tệp với dấu ngoặc kép, như thế mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg, thì đó là mẹo; sử dụng -vlà tùy chọn nhưng nó sẽ cho biết những gì nó đã làm. Tôi tin rằng có một cách thứ hai ngoài việc thoát khỏi tất cả các ký tự, - thậm chí là có thể. Nhược điểm duy nhất tôi biết theo cách này là shell sẽ xử lý văn bản vì nó không nằm trong các trích dẫn đơn lẻ, nhưng nó hoàn toàn không thao túng nó vì nó không phải là mã nội bộ và việc xử lý thêm thời gian là vô nghĩa.

Chỉ cần thử nghiệm, bạn có thể có char like >trong một văn bản trích dẫn kép và nó sẽ được coi là một phần của tên tệp.

Là một mẹo cho tương lai, bạn có thể sử dụng ./ngay trước tên tệp nếu nó gặp sự cố, như các tệp bắt đầu bằng dấu gạch ngang: mv ./-file filesẽ đổi tên -filethành file. Trong trường hợp như thế này, bạn không thể trích dẫn hoặc thoát khỏi tên tệp, như một ngoại lệ.

Thật kỳ lạ, tôi có thể tạo tệp 90843_O'ConnorPaul_GeneralManager.jpgnếu tôi thoát khỏi trích dẫn đơn \', nhưng nó sẽ không tạo ra nếu nó không được trích dẫn kép hoặc thoát.

PS: Bash hoàn thành là một cách khác, nó hoạt động xung quanh vấn đề tên tệp với tệp của bạn, nhưng nó sẽ không hoạt động với các tệp / thư mục "dash": chỉ cần viết một phần của tên và nhấn Tab, phần còn lại.


Tại sao downvote? Tôi đã viết trước những người khác nhưng tôi không đủ nhanh để đăng nó trước.
rautamiekka

Không phải tôi. Không có đầu mối ai bỏ phiếu.
Igor Yirlch

1
Câu trả lời này không đúng, nó bỏ qua dấu gạch chéo ngược trong tên tệp thực sự khó xử lý hơn so với trích dẫn đơn.
Graeme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.