A melhor maneira de expandir o padrão glob?


29

Preciso expandir um padrão glob (como ../smth*/*ou /etc/cron*/) em uma lista de arquivos, programaticamente. Qual seria a melhor maneira de fazer isso?


2
Você não precisa fazer nada de especial, apenas não cite o *.
Kevin

1
Embora se você estiver tentando analisá-lo, use uma matriz como a resposta diz.
Kevin

Respostas:


40

Apenas deixe expandir dentro do lado direito de uma declaração de matriz:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Observe que a opção do shell nullglobprecisa ser definida.
Não está definido por padrão.
Evita um erro caso o glob (ou um dos vários globs) não corresponda a nenhum nome.

Defina bashcom

shopt -s nullglob

ou zshcom

setopt nullglob

E como imprimo essa lista depois?
`` #

É apenas uma matriz regular. Você pode fazer o que puder com qualquer matriz. Adicionado alguns exemplos.
manatwork

1
Há um problema. Se o padrão não corresponder a nenhum arquivo, ele será impresso - o que não é muito bom.
Rogach 12/03/12

5
Ah, shopt -s nullglob resolve isso.
Rogach 12/03/12

1
@lindhe unsetopte o mesmo parâmetro usado para setopt.
Manatwork

0

Não há necessidade de complicar demais as coisas:

echo your/stuff*

isso não funciona. Por exemplo: TEST=$(echo your/stuff*) && eval \"$TEST\"irá produzir:your/stuff*: No such file or directory
Sebastian

@Sebastian, este é um problema do nullglob, veja acima
Alexei Averchenko

1
Não, não é um problema de globos nulos. O uso de caracteres scape está avaliando a TESTvariável como uma sequência, incluindo *e não sendo expandida.
Sebastian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.