grep ouput filepath with file modified date?

Is it possible to make the grep command to output file paths with file modified date like so:

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

or:

/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

Solution 1:

grep itself has no functionality for that. But you can use awk. Use that syntax:

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

That forces grep to print the filenames -H. -r means search recusive in the given directory .. awk's field separator is set to :. The first varibale $1 now contains the filename. awk calls stat -c %z on each filename, which gives the modification time in human readable format. That is saved into the variable r, which is printed in front of each search result.

Solution 2:

Here is a more understandable alternative using xargs

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

Solution 3:

It turns out you can use find -exec to do this. The following is not a complete example as it does not output quite the format requested.

 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

...

The second exec only runs if grep finds a match.

-q is to quite grep.