Considere que tenho um conjunto de sete arquivos:
item1_data
item2_data_more
item3_data
item4_data
item5_data_more
other6_data
other7_data_more
e quero combinar os três que começam com item
mas não terminam com more
. Dado que este é um cenário de exemplo, você deve aceitar que não é suficiente corresponder ao padrão de correspondência positivo item*data?
(ou qualquer variante trivial).
Estou usando bash
com extglob
habilitado. Para casos simples, a descrição na página de manual é suficiente (" !(pattern‐list)
Corresponde a qualquer coisa, exceto a um dos padrões fornecidos "). No entanto, aqui preciso conseguir uma correspondência item
negativa para data
. Finalmente encontrei um que funciona, mas o que não entendo é por que funciona, mas outros falham.
shopt -s extglob # Enable extended globbing
touch {item{1,3,4},other6}_data {item{2,5},other7}_data_more # Example data set
ls !(*more) # Non-"item" files too
item1_data item3_data item4_data other6_data
ls item*!(more) # All "item" files
item1_data item2_data_more item3_data item4_data item5_data_more
ls item!(*more) # Works as required
item1_data item3_data item4_data
Por que o segundo falha e o terceiro é bem-sucedido? Estou pensando que o curinga deveria ser válido em qualquer posição - mas claramente não é. Alguém pode me iluminar, por favor.
Eu diria que a segunda expressão falha porque
item*
corresponde ao nome de arquivo inteiro de cada um desses arquivos, e a string vazia no final corresponde trivialmente a!(more)
.A resposta que eu precisava é encontrada em uma das outras respostas à pergunta No Bash, como posso rmar arquivos em um curinga enquanto forneço mais de uma exceção referenciada por meio de um comentário à minha pergunta.
A frase relevante para mim é esta,
Eu não estava pensando nisso como equivalente a
*
, e isso foi o bloqueador do meu entendimento.