Execute `ls` recursivamente com curingas

Execute `ls` recursivamente com curingas

Estou tentando encontrar todos os arquivos de projeto de um tipo específico com:

ls -ltR *.mb

Eu sei que existem os arquivos que desejo em várias pastas, mas não obtenho resultados. O que eu fiz errado?

Responder1

lsnão corresponde aos padrões. Simplesmente lista os arquivos ou pastas nos argumentos de entrada. *.mbé expandido pela cascaantespassando para ls, portanto, se não houver arquivos nomeados *.mbno diretório atual, nada será gerado, caso contrário, apenas os arquivos no diretório atual serão gerados

A maneira padrão de listar arquivos recursivamente é usarfind

find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '

Dessa forma, você pode personalizar o formato da lista de saída conforme desejar. Ver:Listar arquivos pela data da última edição


Uma forma alternativa é usarglobstarque pode ser habilitado comshopt -s globstar

ls -ltR **/*.mb

O primeiro **/corresponderá a qualquer caminho de subdiretório arbitrário. Em seguida *.mb, combine seus arquivos nesses diretórios

  • estrela glob

    Se definido, o padrão **usado em um contexto de expansão de nome de arquivo corresponderá a todos os arquivos e a zero ou mais diretórios e subdiretórios. Se o padrão for seguido por um /, somente diretórios e subdiretórios corresponderão.

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

Responder2

@phuclv tem duas boas opções. Quando preciso fazer algo semelhante, normalmente canalizo a saída de ls para grep assim:

ls -ltR | grep .*\.mb

isso envia a saída de ls para a entrada de grep em vez de enviar para stdout, e grep então gera apenas as linhas que contêm pelo menos uma correspondência para a expressão regular.

A expressão regular

.*\.mb

pode ser explicado como:

.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb

informação relacionada