Dado é um conjunto de arquivos em (sub)diretórios que correspondem a uma string como em, por exemplo:
find -name 'string' | sort
./1/2/3/4/string
./1/2/3/string
./1/2/string
./1/string
./string
Por que usar globstar
para corresponder aos arquivos como em
ls **string
string
falha ao percorrer os diretórios, enquanto
ls **/string
1/2/3/4/string 1/2/3/string 1/2/string 1/string string
consegue? Do meu entendimento da descrição nas man
páginas, deve corresponder aos (sub)diretórios, não é?
Perguntas como essa geralmente são marcadas como duplicatas de "O resultado de ls * , ls ** e ls ***" , mas a resposta só lida com ls **
, que de fato é recursiva por meio de diretórios. Parece que um asterisco duplo seguido por uma string iria quebrar globstar
.
Correndo GNU bash v.4.4.19(1)
_mint 19
A partir deman bash
estrela glob
Se definido, o padrão ** usado em um contexto de expansão de nome de caminho corresponderá a todos os arquivos e zero ou mais diretórios e subdiretórios. Se o padrão for seguido por um /, somente os diretórios e subdiretórios serão correspondentes.
É assim que funciona em Ksh e Zsh também.
Em Pattern Matching, o manual do Bash diz:
Suponho que isso possa ser lido como significando que "um único padrão" é uma parte separada por barras, portanto
foo/**/bar
, em um único padrão, mas**bar
não.Mas poderia ser mais claro.
Uma barra final após todo o padrão faz com que o padrão corresponda apenas aos diretórios:
Um duplo
*
decai para o efeito de um*
quando não é limitado por (apenas)/
:Qualquer caractere inicial ou final que não seja um
/
faz o**
decaimento:Isso ocorre simplesmente porque um nome de caminho (como um nome de arquivo) não pode conter nenhum arquivo
/
.Não é possível
*
expandir para um nome contendo/
. A**
é um pouco semelhante, ele se expandirá para strings contendo/
apenas quando estiver sozinho ou delimitado por/
(não qualquer outro caractere/string):