Есть ли способ иметьack
сортировать найденные результаты по дате изменения? (в идеале показывать дату рядом с результатом?). Похоже, что ack
у него нет опции даты, но на всякий случай.
Если это невозможно с помощью ack
, как насчет grep
использования комбинации инструментов?
решение1
Ни один из них ack
или grep
не имеет представления о датах изменения файла. Для этого вам нужно сначала сгенерировать список файлов, а затем отсортировать их на основе.
Вы можете использовать xargs
для запуска вывода либо ack
или grep
в другую команду, которая предоставит даты модификации. Для дат модификации вы можете использовать stat
для этого.
Пример
$ 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
ПРИМЕЧАНИЕ:Этот метод покажет вам только имена файлов, соответствующих вашему запросу, а также дату изменения.
решение2
С помощью инструментов GNU:
grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Или,
ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
Используется awk
для отделения имени файла от обычного grep
вывода и awk
вызовов date
для извлечения даты файла. grep
Предоставляется -H
возможность гарантировать, что имя файла будет показано в выводе, даже если в командной строке указано только одно имя.
В качестве примера вывода:
$ 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
Объяснение awk
команд
-F:
Это устанавливает разделитель полей таким
:
образом, что первое поле будет именем файла. (Мы надеемся, что само имя файла не содержит двоеточия.)"date -r \""$1"\" +\"%F %R\"" | getline d
Это выполняется
date -r filename +"%F %R"
для получения даты изменения файла в форме, пригодной для сортировки. Дата сохраняется в переменнойd
.print d,$0
Это выведет на печать данные, за которыми последует строка вывода из
grep
.