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
, test3
etc..., que contêm a string hello
de alguma forma. Pode ser apenas hello
, pode ser helloJASKFNASKFN
etc.
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 grep
ou find
para 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 hello
no conteúdo de arquivos cujo nome é test
seguido 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 qualifiers
a lista de qualificadores globais e a lista de critérios o
pelos quais o qualificador pode classificar.
Substitua o
por O
para inverter a ordem ( On
para classificar inversamente por nome).
Use (.n)
para que a classificação por nome seja numérica ( test10
para vir depois test9
, não entre test1
e 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 -V
opção sort
para 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 -r
para sort
reverter a ordem.