Ký hiệu *. * Được gọi là gì?


Câu trả lời:


20

Giải thích *.*theo hệ thống Windows / DOS cũ

Tầm quan trọng ở đây liên quan nhiều đến Windows / DOS hơn là Unix / Linux. Trên các hệ thống Windows / DOS cũ, đó là mẫu 'ký tự đại diện'. Các mẫu ký tự đại diện đã được sử dụng để khớp tên tệp theo cách tương tự với các khối Unix. Ký *.*tự đại diện thường được sử dụng để khớp với bất kỳ tệp nào.

Như với một thế giới Unix, ý *chí sẽ khớp với bất kỳ chuỗi ký tự nào trong tên tệp, vì *chính nó cũng sẽ khớp với bất kỳ tệp nào. Tuy nhiên, lý do tại sao *.*sẽ khớp với bất kỳ tên tệp nào là do sự khác biệt trong cách thức hoạt động của các ký tự đại diện này. Theo bài viết này :

Bất kỳ ký tự nào ngoài dấu chấm xuất hiện sau dấu hoa thị đều không có hiệu lực, vì dấu hoa thị di chuyển con trỏ đến vị trí 12, tại đó không có gì thay đổi trạng thái phân tích ngoại trừ dấu chấm, xóa ba vị trí cuối cùng và di chuyển con trỏ.

Hành vi này (hơi kỳ lạ theo quan điểm của Unix) có nghĩa là một dấu chấm theo dấu chấm *không thực sự khớp với một dấu chấm, nhưng chỉ là một cách hackish để cho phép bạn thêm nhiều ký tự vào mẫu. Điều này có nghĩa là thêm một vị trí khác *sẽ phù hợp với bất cứ điều gì trong ba vị trí cuối cùng này.

Điều này có ý nghĩa hơn một chút khi bạn xem xét rằng cú pháp đã được sử dụng trên DOS và các hệ thống Windows cũ trước Windows 95 yêu cầu tên tệp 8.3 . Những tên tệp này chỉ được phép có một dấu chấm và nhiều nhất là ba ký tự theo dấu chấm. Hầu hết, nếu không phải tất cả các tệp trên hệ thống sẽ có phần mở rộng ba ký tự (mặc dù về mặt kỹ thuật thì phần mở rộng ngắn hơn hoặc không được phép), vì vậy bằng cách nào đó tôi đoán rằng nên sử dụng *.*để khớp với bất kỳ tệp nào (ít nhất là từ phối cảnh logic WindTHERy bị vênh ).

Giải thích *.*trong shell Unix

Trong hệ vỏ Unix, như những người khác đã chỉ ra, điều này thể hiện một 'mở rộng tên đường dẫn' hoặc 'toàn cầu'. Các *không có bất kỳ nhảy lẻ đến hành vi kết thúc và do đó không dẫn đến ký tự sau đó bị bỏ qua. *.*mẫu sẽ khớp với bất kỳ tên tệp nào chứa dấu chấm (ngoại trừ lúc bắt đầu). Điều này chắc chắn sẽ không khớp với bất kỳ tệp nào vì có nhiều tệp trên hệ thống Unix / Linux không có tiện ích mở rộng (hoặc nếu không có dấu chấm vì điều này cũng được cho phép).

Lý do *.*không khớp dấu chấm khi bắt đầu tên tệp trên Unix là vì đặt dấu chấm ở đầu là cách các tệp được 'ẩn' và các tệp ẩn được loại trừ khỏi các khối theo mặc định. Để khớp chúng trong vỏ POSIX, một dấu chấm cần được đặt rõ ràng khi bắt đầu mẫu. Trong bashcác dotglobtùy chọn vỏ có thể được thiết lập hoặc các GLOBIGNOREbiến thể được thiết lập một cách thích hợp, nhưng đây là một câu hỏi!


1
Cần lưu ý rằng các phiên bản Windows hiện tại dường như hoạt động logic hơn. Cụ thể, "Bất kỳ ký tự nào ngoài dấu chấm xuất hiện sau dấu hoa thị đều không có hiệu lực" không còn đúng nữa; ít nhất là khi lọc các tệp trong hộp thoại Mở tệp chuẩn trên Windows 7 theo mẫu *7.*, hãy lấy tất cả các tệp có ký tự cuối cùng trước phần mở rộng là 7, và với *sa*, tôi nhận được tất cả các tệp có chứa chuỗi con saở bất kỳ đâu trong tên tệp, v.v. (Theo đó, bài viết bạn trích dẫn có tiêu đề như thế nào đã làm ký tự đại diện làm việc trong MS-DOS ? (Nhấn mạnh thêm bởi bản thân mình).)
HOẶC Mapper

1
@ORMapper, đã cập nhật các tiêu đề để phản ánh điều này. Hành vi này là trước Windows 95, nằm trong câu trả lời (mặc dù tiêu đề đã gây hiểu nhầm).
Graeme

11

Đó là globtrong bash, Dưới đây tôi đã trích dẫn từ hướng dẫn bash:

bash - GNU Bourne-Again SHell

*

Phù hợp với bất kỳ chuỗi, bao gồm cả chuỗi null. Khi tùy chọn shell globalstar được bật và *được sử dụng trong ngữ cảnh mở rộng tên đường dẫn, hai mẫu liền kề *sđược sử dụng làm một mẫu sẽ khớp với tất cả các tệp và không hoặc nhiều thư mục và thư mục con. Nếu theo sau bởi a /, hai liền kề *ssẽ chỉ khớp với các thư mục và thư mục con.

Trong trường hợp này, *.*khớp bất kỳ tệp nào có chứa một dấu chấm .trong tên của nó.

Bạn có thể xem thêm chi tiết ở đây .


8

Dấu hoa thị *là một globngôn ngữ vỏ. Trích dẫn từ ngôn ngữ lệnh Shell :

Dấu hoa thị ( '*') là một mẫu sẽ khớp với bất kỳ chuỗi nào, kể cả chuỗi null.

Tuy nhiên, nó không khớp với tên tệp bắt đầu bằng .trừ khi tùy chọn shell dotglobđược đặt.

Khi bạn sử dụng *.*, nó phù hợp với bất cứ điều gì:

  • không bắt đầu với một .
  • chứa ít nhất một .

Bạn cũng có thể muốn tham khảo Mở rộng tên tệp trong hướng dẫn.


6

Rất nhiều người đến từ Windows nghĩ *.*là dành cho tất cả các tệp. Trên Windows, nó là. Trên UNIX, tất cả các tệp chứa ít nhất 1 dấu chấm trong tên của chúng. *tự nó hoạt động tốt trong Windows (có từ thời DOS trở lại); tuy nhiên các sách giáo khoa cũ được xuất bản *.*và nó dường như là một thói quen khó bỏ.


4

*là một ký tự đại diện được sử dụng bởi shell để thực hiện mở rộng tên tệp , còn được gọi là "globalbing". *mở rộng ra bất cứ thứ gì, kể cả không có gì (ví dụ, *.*sẽ khớp file., v.v.). Ký tự đại diện phổ biến khác là ?, phù hợp với bất kỳ ký tự đơn.

Đừng nhầm lẫn chức năng của các ký tự đại diện này với việc sử dụng cùng các ký tự trong các biểu thức thông thường (chẳng hạn như các ký tự được sử dụng với grep).


3

Đó là star-dot-star - ít nhất, trong thế giới DOS (và sau này, tất nhiên, Windows). Trong DOS, dấu chấm .có ý nghĩa kỳ diệu đặc biệt, vì tên tệp là cơ sở tám ký tự (sau này được mở rộng, nhưng hãy ở lại trường cũ) và phần mở rộng ba ký tự (xác định loại tệp). Trong Unix, loại tệp thường được xác định bởi hai byte đầu tiên của tệp (hoặc ma thuật khác) và phần mở rộng mang tính thông tin nhưng không mang nhiều ý nghĩa. Ngoại trừ khi điều này đã bị mờ đi.

Vì vậy, trong Unix, không có ý nghĩa đặc biệt. Dấu hoa thị là một ký tự "toàn cầu" trong hệ vỏ Unix và là ký tự đại diện cho bất kỳ số lượng ký tự nào (bao gồm số không). ?là một nhân vật phổ biến khác, khớp chính xác với một trong bất kỳ nhân vật nào.

*.*phù hợp với bất kỳ tên tệp nào chứa ít nhất một .. Nó không có một tên đặc biệt hoặc bất kỳ ý nghĩa nào hơn *a*hoặc *_*. Và *.?sẽ khớp bất kỳ tệp nào có dấu chấm và chính xác một ký tự sau dấu chấm đó. Ngoài ra còn có một số mẫu hình cầu mở rộng phức tạp hơn - xem trang người đàn ông của bạn.

"Từ điển hacker mới" (bản mở rộng của "Tệp Jargon" cũ của MIT) lưu ý rằng "ngôi sao" là tên phổ biến nhất cho *biểu tượng (theo sau splat) và tôi nghĩ rằng điều đó vẫn đúng trong thực tế và .chắc chắn là phổ biến " dấu chấm ", vì vậy, mặc dù nó không có bất kỳ ý nghĩa đặc biệt nội tại nào như là một biểu tượng kết hợp, chuỗi vẫn được gọi một cách hợp lý là star-dot-star trên Unix. (Nó chỉ ít hữu ích hơn.)


Điều này nghe có vẻ lạ nhưng cảm ơn bạn đã đề cập đến "ngôi sao chấm sao", đó là điều khiến trang này trở nên dễ hiểu!
Điểm_Under

3

Ở đây thực sự có 2 biểu tượng, dấu hoa thị *và dấu chấm .. Các shell thường chỉ giải thích dấu hoa thị là bất kỳ ký tự nào, nhưng trong regex, nó có nghĩa là một quả cầu tham lam. Trong trường hợp này, nó sẽ khớp với bất cứ thứ gì không kết thúc hoặc bắt đầu bằng dấu chấm, nhưng chứa ít nhất một:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match

1
onlydotatend.Trường hợp của bạn là một trận đấu, chắc chắn?
Graeme

@Graeme không. touch 'onlydotatend.' && echo *.*không trả lại
Braiam

1
Làm cho tôi! Trên cả bashdash. Bạn đang sử dụng vỏ gì?
Graeme

@Graeme zsh, và bạn đúng không.
Braiam

Tôi mới thử cái này trên zshcấu hình vanilla và nó cũng hoạt động ở đó. Tôi không hiểu làm thế nào onlydotatend.không thể là một trận đấu, có một tùy chọn cấu hình nào thực hiện điều này không?
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.