Como classifico a saída do grep pelo tempo + data do arquivo criado?

1

Quando executo este comando,

grep _rlnAveragePmax *model*

Eu recebo esta saída:

run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772
run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500

Mas a saída acima é classificada em ordem alfabética. Se nós os classificamos por time + date created, a saída deve ficar assim:

run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772

O que devo fazer ao meu comando grep para obter a saída classificada por time + date criada?

    
por user165209 14.12.2016 / 00:34

2 respostas

1

A menos que você esteja executando o macOS, a data em que um arquivo é criado não será armazenada. Esse conceito é mal definido de qualquer maneira, já que editar um arquivo geralmente cria um novo arquivo que substitui a versão anterior. O que está registrado é a data em que um arquivo foi modificado pela última vez (que inclui tanto a criação inicial quanto qualquer edição subseqüente).

A maneira mais fácil de classificar os arquivos pelo tempo de modificação é executar zsh (em oposição a outros shells menos poderosos como bash, ksh ou fish). Em zsh, você pode usar qualificadores de glob como Om para classificar arquivos por modificação tempo (mais antigo primeiro, faça com que Om fique mais jovem primeiro).

grep _rlnAveragePmax *model*(Om)

Isso fornece o resultado desejado, pois grep percorre os arquivos na ordem dada na linha de comando.

    
por 14.12.2016 / 02:02
0

Primeiro, faça um tempo classificando ls, e depois canalize o stdout para grep através de xargs, usando o sinalizador -H para incluir o nome do arquivo (já que ele fará isso apenas para um arquivo, o padrão não inclui o nome do arquivo)

Em um primeiro grep após ls, os diretórios são excluídos (pense que essa não é uma pesquisa recursiva do exemplo fornecido). Um segundo grep após ls, filtros para o nome do arquivo (sem xargs)

ls -tpQ --quoting-style=shell | grep -v / | grep model | xargs -i grep -H _rlnAveragePmax {}

Atualize após os valiosos comentários do Wildcard: Para levar em conta todos os casos em que nomes de arquivos podem ter caracteres estranhos, os números de inodes são extraídos de ls e canalizados para "localizar" para correspondência de número de inode e execução do comando grep. xargs é substituído por "while read line", pois haveria dois {} 's que o comando xargs não poderia diferenciar

Links simbólicos são seguidos, apenas arquivos são incluídos, excluindo diretórios, etc. O argumento maxdepth é redundante neste contexto (apenas arquivos são deixados), entretanto eu o incluí para que uma busca recursiva também seja possível, alterando os argumentos:

ls -ti | cut -d " " -f1 | while read line; do find -L . -maxdepth 1 -type f -inum $line -exec grep -H xxx {} \; ; done
    
por 14.12.2016 / 00:50

Tags