Como exibir uma lista ordenada de arquivos que contém determinada string no terminal Linux

Como exibir uma lista ordenada de arquivos que contém determinada string no terminal Linux

Suponha que eu tenha 3 pastas em diretórios diferentes, algumas delas contendo mais algumas subpastas, e em cada pasta/subpasta eu tenho arquivos de texto chamados test1, test2, test3etc..., que contêm a string hellode alguma forma. Pode ser apenas hello, pode ser helloJASKFNASKFNetc.

Como posso exibir uma lista ordenada desses arquivos? Digamos que eu queira classificar pelos nomes ou pela data de modificação. Entendo que posso usar o comando grepou findpara pesquisar e exibir esses arquivos, mas não tenho certeza de como exibi-los de maneira ordenada.

Responder1

É mais fácil se você classificar a lista de arquivos antes de passá-la para grep:

Em zsh, você pode fazer:

grep -le hello -- **/test<->(.)

Que procura hellono conteúdo de arquivos cujo nome é testseguido por um ou mais dígitos decimais ( <->sendo uma forma de <x-y>padrão para corresponder a intervalos de números), dentro ou abaixo do diretório de trabalho atual, ignorando diretórios ocultos.

As expansões Glob por padrão são classificadas por nome.

Para classificar por hora de modificação, use (.om)em vez de (.). ou (.oL)por tamanho. Consulte info zsh qualifiersa lista de qualificadores globais e a lista de critérios opelos quais o qualificador pode classificar.

Substitua opor Opara inverter a ordem ( Onpara classificar inversamente por nome).

Use (.n)para que a classificação por nome seja numérica ( test10para vir depois test9, não entre test1e test2).

Se você se deparar com umMuitos argumentoserro (causado por uma limitação da execve()chamada do sistema da maioria dos sistemas):

autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --

Com ferramentas GNU e qualquer shell (exceto (t)csh onde você precisaria colocar o comando em uma linha):

Para classificar por nome:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -print0 |
  sort -z |
  xargs -r0 grep -le hello --

(adicione a -Vopção sortpara uma classificação numérica)

Para classificar por hora de modificação:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
  sort -zrn |
  cut -zf2- |
  xargs -r0 grep -le hello --

Adicionar/remover -rpara sortreverter a ordem.

informação relacionada