zsh: mengecualikan file dari suatu pola

18

Katakanlah saya memiliki file berikut:

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

Saya pikir perintah berikut

print -l foo/*~{type_B*}

akan mencetak semuanya di bawah foo kecuali hal-hal yang dimulai dengan type_Btetapi tidak, sebaliknya ia mencetak semuanya di bawah foo:

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

Saya juga mencoba print -l foo/*~type_Bdan mendapatkan hal yang sama.

Bagaimana cara ~kerja wildcard pengecualian di zsh?

Amelio Vazquez-Reina
sumber

Jawaban:

10

Anda harus memasukkan direktori ke dalam pengecualian: print -l foo/*~foo/type_A*atau print -l foo/*~{foo/type_A*}.

Jika mau, Anda bisa mengganti direktori dengan wildcard: print -l foo/*~*/type_A*

Jofel
sumber
Terima kasih! Tentang pola kedua, apakah Anda keberatan menjelaskan cara kerja pola tersebut foo/*~*/type_A*? Apakah yang kedua *diperluas ke setiap folder di bawah direktori kerja, atau cukup pintar untuk hanya memperluas foo?
Amelio Vazquez-Reina
@roseck Karena tampaknya sangat cepat (misalnya ketika Anda menjalankan print *~**/*di /direktori), saya berasumsi bahwa itu pertama-tama memperluas pola pertama dan kemudian menghapus semua kecocokan yang cocok dengan pola pengecualian.
jofel
2
@roseck ~adalah murni tekstual, bagian sebelum ~mengembang seperti biasa, maka bagian setelah strip cocok. @Jofel Tes yang lebih baik adalah print /**/*~*: Anda dapat mengamati bahwa itu melintasi seluruh pohon, bahkan jika akhirnya tidak mencetak apa pun.
Gilles 'SANGAT berhenti menjadi jahat'
Saya pikir dia ingin mengecualikan type_B tetapi memasukkan type_A.
systemovich
Jawaban yang benar adalah di bawah ini
aryndin
30

zsh memiliki ^operator glob ketika EXTENDED_GLOB aktif. Sepertinya sangat cocok untuk situasi yang Anda nyatakan:

setopt extendedglob
print -rl foo/^type_A*

Ini berarti "cocokkan apa pun, kecuali yang cocok dengan pola berikut", tetapi efeknya terbatas pada bagian dari pola antara garis miring, atau antara awal pola dan garis miring pertama, atau (seperti dalam kasus ini) antara yang terakhir garis miring dan ujung polanya.

Anda dapat melihat opsi zsh yang saat ini diaktifkan dengan:

setopt

Dan nonaktifkan EXTENDED_GLOB dengan:

unsetopt extendedglob
Chris Johnsen
sumber