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 ls
ou a find
usando 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*out
corresponderia a qualquer nome contendo a string abc
e terminando em out
.
Se nenhum arquivo corresponder ao padrão, o padrão não será expandido. Se isso acontecer, ls
obterá o padrão *abc*out
como argumento em vez de um nome de arquivo válido e reclamará de ls: cannot access *abc*out: No such file or directory
.
Para bash
exibir 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 failglob
opçã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"