Usando vários curingas em um globo

Usando vários curingas em um globo

No meu diretório, tenho uma lista de arquivos com extensões diferentes, como

file-abc-12.out
file-abc-12.csv
file-abc-12.txt
file-xyz-12.out
file-xyz-12.csv
file-xyz-12.txt
file-abc-04.out
file-abc-04.csv
file-abc-04.txt
file-xyz-04.out
file-xyz-04.csv
file-xyz-04.txt

Se eu quiser apenas listar os arquivos que contêm abc e terminam em .out, como faria isso? Quero realizar a lsou a findusando duas pesquisas de correspondência de padrões *abc*e *out. Eu só sei pesquisar um ou outro de cada vez. Como faria para pesquisar nomes de arquivos com as duas condições?

Responder1

Isso lhe dará o que você deseja:

$ find . -name '*abc*' -o -name '*out'

Responder2

Estou interpretando o "e" usado na pergunta como um "e lógico" estrito, ou seja, como "encontrar arquivos cujos nomes correspondamambos *abc*e *out".

Você pode usar vários curingas em um padrão globbing de nome de arquivo:

$ ls *abc*out

ou

$ find . -type f -name "*abc*out"

por exemplo.

O padrão *abc*outcorresponderia a qualquer nome contendo a string abce terminando em out.

Se nenhum arquivo corresponder ao padrão, o padrão não será expandido. Se isso acontecer, lsobterá o padrão *abc*outcomo argumento em vez de um nome de arquivo válido e reclamará de ls: cannot access *abc*out: No such file or directory.

Para bashexibir um erro sobre a impossibilidade de expandir um padrão globbing de arquivo em vez de passar o padrão não expandido para ls, defina a failglobopção shell:

bash-4.4$ ls *abc*out
ls: *abc*out: No such file or directory

bash-4.4$ shopt -s failglob

bash-4.4$ ls *abc*out
bash: no match: *abc*out

Responder3

A solução que encontrei para mim envolveu o uso do grep. Segue-se:

$ ls *out | grep "abc"

informação relacionada