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

23

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_files está vazia embora)

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

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

    
por Amelio Vazquez-Reina 14.12.2011 / 06:48

4 respostas

30

Ative a opção null_glob do seu padrão com o qualificador N glob.

list_of_files=(*(N))

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

setopt null_glob

Esta resposta tem equivalentes de bash e ksh.

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

    
por 14.12.2011 / 11:59
13

A melhor maneira: for a in *(.N); do ... ; done . A opção N faz com que o zsh forneça uma lista vazia para, e para 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 de bash): ele muda todos os globs e facilmente interrompe chamadas para ls.

    
por 13.05.2014 / 12:04
3

Acho que você está procurando a opção NULL_GLOB :

   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.
    
por 14.12.2011 / 09:31
-1

Tente desta maneira:

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

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

    
por 14.12.2011 / 08:01

Tags