Eu gostaria de escrever algo como isto:
$ ls **.py
para obter todos os nomes de arquivos .py, percorrendo recursivamente uma hierarquia de diretórios.
Mesmo se houver arquivos .py para encontrar, o shell (bash) fornecerá esta saída:
ls: cannot access **.py: No such file or directory
Alguma maneira de fazer o que eu quero?
Edição: Gostaria de especificar que não estou interessado no caso específico de ls
, mas a pergunta é sobre a sintaxe glob.
nullglob
nullglob
, eu recomendo fortemente a leitura após os avisos .wc -l {**,.}/*.py
funciona muito bem** não faz nada além de um único *, ambos operam no diretório atual
fonte
find
se não tiver o bash 4. Exemplos:yourcommand `find . -name '*.py'`
(observe os backticks);find . -name '*.py' -exec yourcommand {} \;
.Desde o Bash 4 (incluindo também o zsh) , foi adicionada uma nova opção de globbing (
globstar
), que trata o padrão de maneira**
diferente quando está definido.Ele corresponde ao padrão curinga e retorna 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 maneira semelhante a*
, mas repete todos os diretórios recursivamente (como um loop).Para ver se está ativado, verifique-o
shopt globstar
(em scripts, useshopt -q globstar
).O exemplo
**.py
funcionaria apenas para o diretório atual, pois não retorna uma lista de diretórios que podem ser recorrentes; é por isso que você precisa usar vários curingas no nível de diretório**/*.py
, para que possa ir mais fundo.Por favor em encontrar SO alguns testes de sintaxe que fiz para encontrar todos os arquivos de forma recursiva.
fonte