Tại sao dấu gạch chéo ngược trước dấu hoa thị trong `find`?


9

Trong lệnh này:

find . -name \*.pyc -delete

Tại sao một dấu gạch chéo ngược cần thiết trước đây *.pyc?


Trang man cho findnên có một phần được gọi NON-BUGSvới một cái gì đó tương tự như một ví dụ và giải thích lý do tại sao nó cần thiết.
Brian

Câu trả lời:


19

Một quả cầu không được trích dẫn sẽ được mở rộng bởi shell trước khi findđược thực thi. (Tham khảo Mở rộng tên tệp trong hướng dẫn.)

Nói như vậy:

find . -name *.pyc -delete

sẽ thực sự thực thi:

find . -name file1.pyc file2.pyc file3.pyc -delete

giả sử có 3 tệp .pyc trong thư mục hiện tại và dẫn đến lỗi thay thế.

Dấu gạch chéo ngược làm cho lớp vỏ vượt qua toàn cầu find, nghĩa là nó hoạt động như thể *.pycđược trích dẫn.

Tốt nhất, bạn nên trích dẫn một quả địa cầu:

find . -name '*.pyc' -delete

@RamRachum, nhưng ký tự nhiều hơn khi gõ.
Paul Draper

1
@PaulDraper Có thể đọc và ít mắc lỗi> Ngắn hơn bằng một lần nhấn phím
Doorknob

Báo giá duy nhất là con đường để đi. Tôi thậm chí không bao giờ nghĩ rằng bạn có thể sử dụng dấu gạch chéo ngược theo cách này ...
Floris

4

Trước khi shell của bạn phát findlệnh, nó sẽ thực hiện các mở rộng khác nhau . Làm như vậy, nó cũng xử lý các ký tự đặc biệt (hoặc, các ký tự có ý nghĩa đặc biệt), trong đó *ký tự đại diện - ký tự toàn cầu. Đây là cái gọi là mở rộng tên tệp.

Giả sử bạn có hai tệp trong thư mục của mình:

  • foo.pyc
  • bar.pyc

Sau đó *.pycsẽ mở rộng sang cả hai tên. Vì vậy, nếu bạn viết:

find . -name *.pyc -delete

sau đó shell thực sự sẽ gọi:

find . -name foo.pyc bar.pyc -delete

điều này không có nhiều ý nghĩa, bởi vì bạn chỉ có thể có một đối số cho -name. Đó là lý do tại sao bạn cần phải thoát khỏi ký tự đặc biệt để ngăn không cho nó bị hiểu bởi vỏ. Bạn làm điều đó bằng cách thoát dấu gạch chéo ngược, hoặc cách khác, trích dẫn nó.

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.