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?

Rogach
fonte
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
homem a trabalhar
fonte
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*
Alexei Averchenko
fonte
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