Como obter silenciosamente uma string vazia de um padrão glob sem correspondências

24

Digamos que eu tenha uma pasta com três arquivos:

foo1
foo2
bar

1. Se eu correr

list_of_files=$(print foo*)
echo $list_of_files

Eu recebo: foo1 foo2

2. Se eu correr

list_of_files=$(print bar*)
echo $list_of_files

Eu recebo: bar

3. No entanto, se eu correr

list_of_files=$(print other*)
echo $list_of_files

Eu recebo: zsh: no matches found: other*(a variável $list_of_filesestá vazia)


Existe uma maneira de pedir ao zsh para não reclamar se não puder corresponder a uma expansão glob?

Meu objetivo é usar o mecanismo acima para coletar silenciosamente uma lista de arquivos que correspondem a um determinado padrão glob.

Amelio Vazquez-Reina
fonte

Respostas:

33

Ative a null_globopção do seu padrão com o Nqualificador glob.

list_of_files=(*(N))

Se você estiver fazendo isso em todos os padrões em um script ou função, ative a null_globopção:

setopt null_glob

Esta resposta tem equivalentes bash e ksh.

Não use printou comande a substituição! Isso gera uma string que consiste nos nomes dos arquivos com espaços entre eles, em vez de uma lista de strings. (Consulte O que é a divisão de palavras? Por que é importante na programação de shell? )

Gilles 'SO- parar de ser mau'
fonte
15

A maneira melhor: for a in *(.N); do ... ; done. A opção N faz com que o zsh entregue uma lista vazia para for e for iterará zero vezes.

Cuidado com ls *.foo(.N); Quando ls recebe uma lista de argumentos vazia, lista todos os arquivos em vez de nenhum. É por isso que eu não gosto de NULL_GLOB (ou seu equivalente bash): Ele muda todos os globs e facilmente interrompe as chamadas, por exemplo, ls.

arnt
fonte
Gostaria de ver sua resposta aqui @arnt, é exatamente isso que eu precisava.
Gtd
Por que o .in (.N)? Outras respostas, (N)por si só, qual é a diferença?
Michael Dorst
A pergunta era sobre arquivos e .restringe a glob a corresponder apenas a arquivos.
arnt
4

Eu acho que você está procurando a NULL_GLOBopção:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.
enzotib
fonte
-1

Tente desta maneira:

list_of_files=$(print other*) 2>/dev/null

Ele redirecionará a saída de erro do stderr para / dev / null e não será exibido.

pressa
fonte
Isso não funciona.
Pablo Olmos de Aguilera C.