Existe alguma maneira de terack
classificar os resultados encontrados por data de modificação? (de preferência mostrando a data ao lado do resultado?). Não parece ack
ter opção de data, mas apenas por precaução.
Se isso não for possível com ack
, que tal grep
usar uma combinação de ferramentas?
Responder1
Nem tem noção das datas de modificação de um arquivo ack
. grep
Para isso, você precisará gerar primeiro a lista de arquivos e depois classificá-los com base nela.
Você pode usar xargs
para executar a saída de um ack
ou grep
outro comando que fornecerá as datas de modificação. Para as datas de modificação, você pode usar stat
para fazer isso.
Exemplo
$ grep -Rl awk * | xargs -n 1 stat --printf "%y ------ %n\n"
2013-11-12 10:06:16.000000000 -0500 ------ 100855/tst_ccmds.bash
2013-11-13 00:32:11.000000000 -0500 ------ 100911/cmd.bash
2013-11-23 03:16:17.000000000 -0500 ------ 102298/cmd.bash
2013-12-14 20:06:04.467708173 -0500 ------ 105159/cmd.txt
2013-12-16 03:20:48.166016538 -0500 ------ 105328/cmds.txt
2013-01-14 14:17:39.000000000 -0500 ------ 106932/red5-1.0.1.tar.gz
OBSERVAÇÃO:Este método mostrará apenas os nomes dos arquivos que correspondem à sua consulta junto com a data de modificação.
Responder2
Com ferramentas GNU:
grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Ou,
ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Isso é usado awk
para separar o nome do arquivo da grep
saída normal e awk
chama date
para recuperar a data do arquivo. grep
tem a -H
opção de garantir que um nome de arquivo seja mostrado na saída, mesmo que apenas um apareça na linha de comando.
Como exemplo de saída:
$ grep setupcon /etc/init.d/* | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
2011-12-05 12:05 /etc/init.d/keymap.sh:# If setupcon is present, then we've been superseded by console-setup.
2011-12-05 12:05 /etc/init.d/keymap.sh:if type setupcon >/dev/null 2>&1; then
2011-12-08 18:00 /etc/init.d/console-setup: if setupcon --save; then
2011-12-08 18:00 /etc/init.d/console-setup:test -f /bin/setupcon || exit 0
2012-04-28 02:41 /etc/init.d/kbd:if which setupcon >/dev/null
2012-09-30 18:02 /etc/init.d/keyboard-setup: if setupcon -k 2>/dev/null; then
2012-09-30 18:02 /etc/init.d/keyboard-setup:test -f /bin/setupcon || exit 0
Explicação dos awk
comandos
-F:
Isso define o separador de campo para
:
que o primeiro campo seja o nome do arquivo. (Temos que esperar que o nome do arquivo em si não contenha dois pontos.)"date -r \""$1"\" +\"%F %R\"" | getline d
Isso é executado
date -r filename +"%F %R"
para obter a data de modificação do arquivo em um formato adequado para classificação. A data é armazenada na variáveld
.print d,$0
Isso imprime os dados seguidos pela linha de saída de
grep
.