zsh: dosyaları bir kalıptan hariç tutma


18

Aşağıdaki dosyaları aldığımı söyle:

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

Aşağıdaki komutu düşündüm

print -l foo/*~{type_B*}

basacaktır şeyi altında foo haricinde ile başlayan şeyler type_Bama, bunun yerine foo altında her şeyi yazdırır değildir:

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

Ben de denedim print -l foo/*~type_Bve aynı şeyi aldım.

İstisna joker karakteri ~zsh'da nasıl çalışır?

Yanıtlar:


10

Dizini istisnaya eklemeniz gerekir: print -l foo/*~foo/type_A*veya print -l foo/*~{foo/type_A*}.

İsterseniz dizini bir joker karakterle değiştirebilirsiniz: print -l foo/*~*/type_A*


Teşekkürler! İkinci kalıp hakkında, kalıbın nasıl foo/*~*/type_A*çalıştığını açıklar mısınız? İkincisi çalışma dizini altındaki her klasöre mi *genişler , yoksa sadece genişleyecek kadar akıllı mıdır? foo
Amelio Vazquez-Reina

(çalıştırdığınızda örneğin gerçekten hızlı görünüyor Çünkü @roseck print *~**/*içinde /dizine), ben o ilk önce kalıbı genişletmek ve daha sonra dışlama desenine uyan tüm maçları kaldırmak varsayalım.
jofel

2
@Göster ~tamamen metinseldir, ~genişlemeden önceki kısım her zamanki gibi genişler, sonra şeritlerden sonraki kısım eşleşir. @Jofel Daha iyi bir test şu şekildedir print /**/*~*: hiçbir şey yazdırmasa bile ağacın tamamını geçtiğini gözlemleyebilirsiniz.
Gilles 'SO- kötü olmayı bırak'

Type_B'yi hariç tutmak istediğini, ancak type_A içerdiğini düşündüm.
systemovich

Doğru cevap aşağıda
aryndin

30

zsh sahip^ EXTENDED_GLOB açıkken glob operatörü. Belirtilen durumunuz için mükemmel bir uyum gibi görünüyor:

setopt extendedglob
print -rl foo/^type_A*

“Aşağıdaki desenle eşleşenler dışında herhangi bir şeyle eşleşmek” anlamına gelir, ancak etkisi desenin eğik çizgiler arasındaki veya desenin başlangıcı ile ilk eğik çizgi arasındaki kısmı veya (bu durumda olduğu gibi) sonuncusu arasındaki eğik çizgi ve desenin sonu.

Şu anda etkin olan zsh seçeneklerini aşağıdakilerle görüntüleyebilirsiniz :

setopt

Ve EXTENDED_GLOB ile aşağıdakileri devre dışı bırakın:

unsetopt extendedglob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.