O que se expande para todos os arquivos no diretório atual de forma recursiva?

Eu sei **/*.ext expande para todos os arquivos em todos os subdiretórios correspondentes a *.ext , mas o que é uma expansão semelhante que inclui todos esses arquivos no diretório atual também?

Isso funcionará no Bash 4:

 ls -l {,**/}*.ext 

Para que o glob de asterisco duplo funcione, a opção globstar precisa ser definida (padrão: on):

 shopt -s globstar 

Do man bash :

     globstar
                   Se definido, o padrão ** usado em uma expansão de nome de arquivo
                   texto irá corresponder a um arquivos e zero ou mais diretórios e
                   subdiretórios.  Se o padrão é seguido por a /, somente
                   diretórios e subdiretórios correspondem.

Isso imprimirá todos os arquivos no diretório atual e seus subdiretórios que terminam em ‘.ext’.

 find . -name '*.ext' -print 

Você pode usar: **/*.* Para include todos os arquivos recursivamente (habilitar por: shopt -s globstar ).

Por favor, veja abaixo os testes de outras variações e como elas se comportam.


Testando a pasta com 3472 arquivos na pasta de repository VLC de amostra:

(Total de arquivos de 3472 contados conforme: find . -type f | wc -l )

  • ls -1 **/*.* – retorna 3338
  • ls -1 {,**/}*.* – retorna 3341 (como proposto por Dennis )
  • ls -1 {,**/}* – retorna 8265
  • ls -1 **/* – retorna 7817, exceto arquivos ocultos (como proposto por Dennis )
  • ls -1 **/{.[^.],}* – retorna 7869 (como proposto por Dennis )
  • ls -1 {,**/}.?* – retorna 15855
  • ls -1 {,**/}.* – retorna 20321

Então eu acho que o método mais próximo para listar todos os arquivos recursivamente é o primeiro exemplo ( **/*.* ) Como por gniourf-gniourf comment (assumindo que os arquivos possuem as extensões apropriadas, ou use o específico), como o segundo exemplo dá mais algumas duplicatas como abaixo:

 $ diff -u <(ls -1 {,**/}*.*) <(ls -1 **/*.*) --- /dev/fd/63 2015-04-19 15:25:07.000000000 +0100 +++ /dev/fd/62 2015-04-19 15:25:07.000000000 +0100 @@ -1,6 +1,4 @@ COPYING.LIB -COPYING.LIB -Makefile.am Makefile.am @@ -45,7 +43,6 @@ compat/tdestroy.c compat/vasprintf.c configure.ac -configure.ac 

e o outro gera ainda mais duplicatas.


Para include arquivos ocultos, use: shopt -s dotglob (desabilitado por shopt -u dotglob ). Não é recomendado, porque pode afetar comandos como mv ou rm e você pode remover acidentalmente os arquivos errados.

 $ find . -type f 

Isso listará todos os arquivos no diretório atual. Você pode então fazer algum outro comando na saída usando -exec

 $find . -type f -exec grep "foo" {} \; 

Isso fará com que cada arquivo do find encontre a string “foo”.

Por que não apenas usar a expansão de chaves para include também o diretório atual?

 ./{*,**/*}.ext 

A expansão de brace acontece antes da expansão glob, para que você possa efetivamente fazer o que quiser com versões mais antigas do bash, e pode renunciar ao monkeying com globstar em versões mais recentes.

Além disso, é considerado uma boa prática no bash include o líder ./ nos seus padrões globais.