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.