How to search contents of Linux files modified between certain dates

Viewed 249

I want to search a directory (excluding paths that contain any of certain words, ideally a regex pattern) and find all files with contents that match my query (ideally a regex pattern, which I'd make case-insensitive) and were modified between 2 specific dates.

Based on this answer, my current command is:

find /mnt/c/code -type f -mtime -100 -mtime +5 -print0 |
xargs -0 grep -l -v "firstUnwantedTerm" 'mySearchTerm'

Apparently this query does not exclude all paths that contain "firstUnwantedTerm".

Also, I'd love if the results could be sorted by modified datetime descending, displaying: their modified time, the full file name, and the search query (maybe in a different color in the console) surrounded by some context where it was seen.

grep -rnwl --exclude='*firstUnwantedTerm*' '/mnt/c/code' -e "mySearchTerm" from here also seemed to be a step in the right direction in the sense that it seems to correctly exclude my exclusion term, but it doesn't filter by modified datetime and doesn't output all the desired fields, of course.

1 Answers

This is just quick & dirty and without sorting by date, but with 3 lines of context before/after each match and coloured matches:

find ~/mnt/c/code -type f -mtime -100 -mtime +5 | grep -v 'someUnwantedPath' | xargs -I '{}' sh -c "ls -l '{}' && grep --color -C 3 -h 'mySearchTerm' '{}'"

Broken down into pieces with some explanation:

# Find regular files between 100 and 5 days old (modification time)
find ~/mnt/c/code -type f -mtime -100 -mtime +5 |

  # Remove unwanted files from list
  grep -v 'someUnwantedPath' |

  # List each file, then find search term in each file,
  # highlighting matches and
  # showing 3 lines of context above and below each match
  xargs -I '{}' sh -c "ls -l '{}' && grep --color -C 3 -h 'mySearchTerm' '{}'"

I think you can take it from here. Of course this can be made more beautiful and fulfill all your requirements, but I just had a couple of minutes and leave it to the UNIX gurus to beat me and make this whole thing 200% better.


Update: version 2 without xargs and with only one grep command:

find ~/mnt/c/code -type f -mtime -30 -mtime +25 ! -path '*someUnwantedPath*' -exec stat -c "%y %s %n" {} \; -exec grep --color -C 3 -h 'mySearchTerm' {} \;

! -path '*someUnwantedPath*' filters out unwanted paths, and the two -exec subcommands list candidate files and then show the grep results (which could also be empty), just like before. Please note that I changed from using ls -l to stat -c "%y %s %n" in order to list file date, size and name (just modify as you wish).

Again, with additional line breaks for readability:

find ~/mnt/c/code
  -type f
  -mtime -30 -mtime +25
  ! -path '*someUnwantedPath*'
  -exec stat -c "%y %s %n" {} \;
  -exec grep --color -C 3 -h 'mySearchTerm' {} \;
Related