Usando vários curingas em uma glob

2

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 terminar em um .out, como farei isso? Desejo executar um ls ou um find usando duas pesquisas de correspondência de padrões *abc* e *out . Eu só sei como procurar um ou outro de cada vez, como eu teria que procurar por nomes de arquivos com ambas as condições?

    
por Ty Seyoum 14.04.2017 / 19:32

3 respostas

4

Estou interpretando o "e" usado na pergunta como um "lógico e" estrito, isto é, como "localizar arquivos cujos nomes correspondem ambos *abc* e *out ".

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

$ ls *abc*out

ou

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

por exemplo.

O padrão *abc*out corresponde a qualquer nome que contenha a string abc e termina em out .

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

Para fazer com que bash exiba um erro sobre não conseguir expandir um padrão de agrupamento de arquivos em vez de passar o padrão não expandido para ls , defina a opção failglob 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
    
por 14.04.2017 / 19:54
3

Isso vai te dar o que você quer:

$ find . -name '*abc*' -o -name '*out'
    
por 14.04.2017 / 20:07
-3

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

$ ls *out | grep "abc"

    
por 15.04.2017 / 01:46