glob recursivo?

69

Eu gostaria de escrever algo assim:

$ ls **.py

para obter todos os nomes de arquivos .py, percorrendo de forma recursiva uma hierarquia de diretórios.

Mesmo se houver arquivos .py para encontrar, o shell (bash) fornece essa saída:

ls: cannot access **.py: No such file or directory

Qualquer maneira de fazer o que eu quero?

EDITAR: Gostaria de especificar que não estou interessado no caso específico de ls , mas a questão é sobre a sintaxe glob.

    
por Paolo 04.10.2012 / 17:30

3 respostas

85

Para fazer globs recursivas no bash, você precisa do recurso globstar do bash versão 4 ou superior.

Do bash manpage:

globstar
    If set, the pattern ** used in a pathname expansion context will
    match all files and zero or more directories and subdirectories.
    If the pattern is followed by a /, only directories and
    subdirectories match.

Para o seu padrão de exemplo:

shopt -s globstar
ls **/*.py
    
por 04.10.2012 / 17:47
9
find . -name '*.py'

** não faz nada além de um único *, ambos operam no diretório atual

    
por 04.10.2012 / 17:41
5

Desde o Bash 4 (incluindo também o zsh) uma nova opção de globbing ( globstar ) foi adicionado, o que trata o padrão ** de maneira diferente quando é definido.

Ele está correspondendo ao padrão curinga e retornando os nomes de arquivos e diretórios correspondentes, substituindo o padrão curinga no comando pelos itens correspondentes.

Normalmente, quando você usa ** , ele funciona de forma semelhante a * , mas recursiva todos os diretórios recursivamente (como um loop).

Para ver se está ativado, confira shopt globstar (no script, use shopt -q globstar ).

O exemplo **.py funcionaria apenas para o diretório atual, pois não retorna a lista de diretórios que podem ser recurses, por isso é necessário usar vários curingas em nível de diretório **/*.py , para que ele possa ir mais profundo.

Por favor encontrar SO alguns testes de sintaxe que fiz para encontrar todos os arquivos de forma recursiva.

    
por 20.04.2015 / 12:07