¿Hay alguna manera de tenerack
¿Ordenar los resultados encontrados por fecha de modificación? (¿Lo ideal sería mostrar la fecha al lado del resultado?). No parece que ack
tenga opción de fecha, pero por si acaso.
Si esto no es posible con ack
, ¿qué tal grep
si utilizamos una combinación de herramientas?
Respuesta1
Ninguno ack
de los dos grep
tiene noción de las fechas de modificación de un archivo. Para eso, primero deberá generar la lista de archivos y luego ordenarlos según posteriormente.
Puede utilizar xargs
para ejecutar la salida de cualquiera de los dos comandos ack
o grep
de otro que proporcionará las fechas de modificación. Para las fechas de modificación puede utilizar stat
para hacer eso.
Ejemplo
$ 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
NOTA:Este método solo le mostrará los nombres de los archivos que coincidieron con su consulta junto con la fecha de modificación.
Respuesta2
Con herramientas GNU:
grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
O,
ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Esto se utiliza awk
para separar el nombre del archivo de la grep
salida habitual y awk
llama date
para recuperar la fecha del archivo. grep
tiene la -H
opción de garantizar que se muestre un nombre de archivo en la salida incluso si solo aparece uno en la línea de comando.
Como ejemplo del resultado:
$ 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
Explicación de awk
comandos.
-F:
Esto establece el separador de campos para
:
que el primer campo sea el nombre del archivo. (Tenemos que esperar que el nombre del archivo en sí no contenga dos puntos)."date -r \""$1"\" +\"%F %R\"" | getline d
Esto se ejecuta
date -r filename +"%F %R"
para obtener la fecha de modificación del archivo en un formato adecuado para su clasificación. La fecha se almacena en la variabled
.print d,$0
Esto imprime los datos seguidos de la línea de salida de
grep
.