2010-08-20 40 views
21

Trong Ryan Bates' Railscast about git, .gitignore tập tài liệu lưu chứa các dòng sau:Bộ chọn ký tự đại diện Unix? (Dấu sao)

tmp/**/*

mục đích của việc sử dụng các dấu sao đôi tiếp theo là một dấu hoa thị như vậy là gì: **/*? Chỉ sử dụng tmp/* thay vì tmp/**/* không đạt được kết quả tương tự?

Googling vấn đề này, tôi đã tìm thấy một bài viết không rõ ràng về IBM và tôi đã tự hỏi liệu có ai đó có thể làm rõ vấn đề không.

+0

Lưu ý: Mặc dù một số vỏ hỗ trợ cú pháp này, Git thì không. Trong một tệp '.gitignore', nó tương đương với' tmp/*/* '. – hammar

Trả lời

24

Nó nói để đi vào tất cả các thư mục con dưới tmp, cũng như nội dung của tmp.

ví dụ: Tôi có những điều sau đây:

$ find tmp 
tmp 
tmp/a 
tmp/a/b 
tmp/a/b/file1 
tmp/b 
tmp/b/c 
tmp/b/c/file2 

đầu ra phù hợp:

$ echo tmp/* 
tmp/a tmp/b 

đầu ra phù hợp:

$ echo tmp/**/* 
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2 

Đây là một tính năng mặc định của zsh, để làm cho nó làm việc trong bash 4, bạn thực hiện:

shopt -s globstar 
+1

giải thích tuyệt vời. cảm ơn! –

+0

Có danh pháp nào cho kiểu kết hợp mẫu này trong Unix không? Tôi đang cố gắng tìm thêm thông tin và tôi không biết cách sử dụng Google. – Jondlm

+0

Kết hợp mẫu cho các tệp được gọi là globbing. Các biến thể cơ bản là '*' cho 0 hoặc nhiều ký tự, '?' Cho bất kỳ ký tự nào và '[CharacterRange]' cho các ký tự khớp với một phạm vi cụ thể, ví dụ: '[0-9]' để khớp với một chữ số. Một số shell mở rộng theo cách riêng của chúng, bao gồm cú pháp '**'. – Petesh

5

Từ http://blog.privateergroup.com/2010/03/gitignore-file-for-android-development/:

(kwoods)

"The double asterisk (**) is not a git thing per say, it’s really a linux/Mac shell thing. 

It would match on everything including any sub folders that had been created. 

You can see the effect in the shell like so: 

# ls ./tmp/* = should show you the contents of ./tmp (files and folders) 
# ls ./tmp/** = same as above, but it would also go into each sub-folder and show the contents there as well." 
1

Theo the documentation of gitignore, cú pháp này được hỗ trợ từ git phiên bản 1.8.2.

Dưới đây là phần có liên quan: dấu sao

Hai liên tiếp (**) trong mô hình phù hợp chống lại tên đường dẫn đầy đủ có thể có ý nghĩa đặc biệt:

  • Một lãnh đạo ** tiếp theo là một dấu gạch chéo có nghĩa là trận đấu trong tất cả các thư mục. Ví dụ: **/foo khớp với tệp hoặc thư mục foo ở bất kỳ đâu, giống như mẫu foo. **/foo/bar khớp với tệp hoặc thư mục bar ở bất kỳ nơi nào nằm ngay dưới thư mục foo.

  • Đường nhỏ /** khớp với mọi thứ bên trong. Ví dụ: abc/** khớp với tất cả các tệp trong thư mục abc, so với vị trí của tệp .gitignore, với độ sâu vô hạn.

  • Dấu gạch chéo theo sau hai dấu hoa thị liên tiếp thì dấu gạch chéo khớp với số không hoặc nhiều thư mục. Ví dụ: a/**/b khớp với a/b, a/x/b, a/x/y/b v.v.

  • Dấu hoa thị liên tiếp khác được coi là không hợp lệ.

Các vấn đề liên quan