ZSH: Globing đệ quy không bao gồm các thư mục ẩn được chỉ định


7

Tôi nghĩ mô hình toàn cầu:

**/(*|.*)

sẽ đại diện cho mọi thư mục và tệp bắt đầu bằng dấu chấm ( .) hoặc không, nhưng nó bỏ qua các thư mục trong thư mục hiện tại bắt đầu bằng ..

Mô hình toàn cầu có nghĩa là gì:

mọi tệp và thư mục có thể hoặc không thể bắt đầu với .các thư mục hiện tại và sâu hơn

Ngoài ra: Làm cách nào tôi có thể loại trừ một thư mục cụ thể (hoặc thậm chí tốt hơn, một mẫu con toàn cầu) khỏi mẫu hình cầu đệ quy như mẫu ở trên?

Tôi đã thử các cách sau để loại trừ thư mục .hgkhỏi cấp độ hiện tại (nhưng bao gồm các thư mục khác bắt đầu bằng .ký tự):

**~.hg/*

nhưng nó đã không đi đệ quy vào các thư mục sâu hơn.

Câu trả lời:


10

Cách dễ nhất để tạo một tệp chấm khớp mẫu chung là sử dụng D vòng loại toàn cầu .

**/*(D)

Các ưu tiên của ~thấp hơn /, vì vậy **~.hg/***trừ các trận đấu cho .hg/*. Nhưng **chỉ đặc biệt nếu nó trước một /, vì vậy ở đây nó khớp với các tệp trong thư mục hiện tại. Để loại trừ .hgvà nội dung của nó, bạn cần

**/*~.hg~.hg/*(D)

Lưu ý rằng zsh vẫn sẽ duyệt qua .hgthư mục, có thể mất một thời gian; đây là một hạn chế của **: bạn không thể đặt danh sách loại trừ trực tiếp ở cấp độ này.


4

**/*(D)(viết tắt của (*/)#*(D)) bao gồm dotfiles và dotdirs như đã nói.

Nếu bạn muốn loại trừ các .hgthư mục ở mọi cấp độ, bạn cần:

(^.hg/)#^.hg(D)

(bạn cần setopt extendedglobcho ^và các #nhà khai thác)

Như đã nói, ~patternsẽ loại trừ các mục (dựa trên việc liệu bản mở rộng đầy đủ của chúng có khớp với "mẫu" sau khi danh sách đã được tạo hay không, vì vậy sẽ không ngăn nó chuyển xuống các thư mục con).

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.