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
ls
nã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 *.mb
no 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 é usarglobstar
que 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