Назад | Перейти на главную страницу

Путь к выходному файлу grep с датой изменения файла?

Можно ли сделать grep команда для вывода путей к файлам с датой изменения файла, например:

12-02-2015 /file/path/to/the/file
16-02-2015 /file/path/to/the/file
25-02-2015 /file/path/to/the/file
03-04-2015 /file/path/to/the/file

или:

/file/path/to/the/file 12-02-2015
/file/path/to/the/file 12-02-2015
/file/path/to/the/file 12-02-2015
/file/path/to/the/file 12-02-2015

grep сам по себе не имеет для этого никаких функций. Но вы можете использовать awk. Используйте этот синтаксис:

grep -Hr pattern . | awk -F: '{"stat -c %z "$1 | getline r; print r": "$0 }'

Это заставляет grep напечатать имена файлов -H. -r означает повторный поиск в данном каталоге .. awkразделитель полей установлен на :. Первый варибал $1 теперь содержит имя файла. awk звонки stat -c %z для каждого файла, что дает время модификации в удобочитаемом формате. Это сохраняется в переменной r, который печатается перед каждым результатом поиска.

Оказывается, можно использовать find -exec сделать это. Следующий пример не является полным, так как он не выводит в требуемом формате.

 find . -exec grep -q set {} \; -exec stat -c "%y %n" {} \;

...

2019-06-03 11:46: 14.565890000 -0700 ./bin/tkdiff_helper.sh

2018-04-24 12: 00: 02.389077000 -0700 ./bin/start_vnc.older 2019-09-04

08: 41: 49.021891000 -0700 ./bin/calmdpv_2016

...

Второй exec запускается только в том случае, если grep находит совпадение.

-q это довольно grep.

Вот более понятная альтернатива с использованием xargs

grep -rl pattern | xargs stat -c %n':'%z | awk -F: '{print $1}'

Утилита grep предназначена не для этого, а для фильтрации строк файла или вывода команды. Что вы можете сделать, так это объединить его с awk через канал, чтобы получить то, что вы хотите, например:

find . -iname 'file-you-want-to-find' -exec stat -c "%y %n" {} \; | awk '{ print $4 " " $1 }' | grep 'date-you-are-looking-for'

С уважением.