zsh: không bao gồm các tệp từ một mẫu


18

Nói rằng tôi có các tập tin sau:

|-- bar
`-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    `-- something_else

Tôi nghĩ lệnh sau

print -l foo/*~{type_B*}

sẽ in mọi thứ bên dưới foo trừ những thứ bắt đầu type_Bnhưng không, thay vào đó, nó in mọi thứ dưới foo:

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else

Tôi cũng đã thử print -l foo/*~type_Bvà nhận được điều tương tự.

Làm thế nào để ký tự đại diện ngoại lệ ~hoạt động trong zsh?

Câu trả lời:


10

Bạn cần bao gồm thư mục vào ngoại lệ: print -l foo/*~foo/type_A*hoặc print -l foo/*~{foo/type_A*}.

Nếu bạn muốn, bạn có thể thay thế thư mục bằng ký tự đại diện: print -l foo/*~*/type_A*


Cảm ơn! Về mẫu thứ hai, bạn có phiền giải thích cách thức foo/*~*/type_A*hoạt động của mẫu không? Là thứ hai *mở rộng đến mọi thư mục trong thư mục làm việc, hoặc nó đủ thông minh để chỉ mở rộng đến foo?
Amelio Vazquez-Reina

@roseck Vì có vẻ như rất nhanh (ví dụ: khi bạn chạy print *~**/*trong /thư mục), tôi giả sử rằng trước tiên nó mở rộng mẫu đầu tiên và sau đó xóa tất cả các kết quả khớp với mẫu loại trừ.
jofel

2
@roseck ~hoàn toàn là văn bản, phần trước khi ~mở rộng như mọi khi, sau đó là phần sau khi bỏ đi. @Jofel Một thử nghiệm tốt hơn sẽ là print /**/*~*: bạn có thể quan sát rằng nó đi ngang qua toàn bộ cây, ngay cả khi nó không in được gì.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi nghĩ rằng anh ấy muốn loại trừ type_B nhưng bao gồm type_A.
systemovich

Câu trả lời đúng là bên dưới
aryndin

30

zsh^toán tử toàn cầu khi bật EXTENDED_GLOB. Có vẻ như phù hợp hoàn hảo cho tình huống đã nêu của bạn:

setopt extendedglob
print -rl foo/^type_A*

Nó có nghĩa là phù hợp với bất cứ thứ gì, ngoại trừ những gì phù hợp với mẫu sau đây, nhưng hiệu ứng của nó bị giới hạn ở phần mẫu giữa các dấu gạch chéo, hoặc giữa phần đầu của mẫu và dấu gạch chéo đầu tiên, hoặc (như trong trường hợp này) giữa phần cuối cùng dấu gạch chéo và kết thúc của mô hình.

Bạn có thể xem các tùy chọn zsh hiện được bật với:

setopt

Và vô hiệu hóa EXTENDED_GLOB với:

unsetopt extendedglob
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.