Search code examples
bashgrepfindstat

find files by extension containing certain text and display the file path and modified date


I need to find all .txt files containing "abc" in their content and display the filepath and modified date:

Maybe something like:

> find /folder -iname '*.txt' -print0 | xargs -0 grep -i -n -l "abc" | xargs echo <filepath> <modified_date>

Expected output:

/folder/hello.txt 2017-12-12 32:56:23
/folder/d1/d2/hey.txt 2017-12-12 32:56:23

Solution

  • It seems you have GNU find, so you can use the -printf predicate. This should get you on the right track:

    find /folder -iname '*.txt' -type f -exec grep -q 'abc' {} \; -printf '%p %Tx %Tr\n'
    

    The %T modifier for the -printf predicate is what you're looking for. The funny x and r are for the date and time. More information from man find:

                     @      seconds  since Jan. 1, 1970, 00:00 GMT, with frac‐
                            tional part.
    
                     Time fields:
    
                     H      hour (00..23)
    
                     I      hour (01..12)
    
                     k      hour ( 0..23)
    
                     l      hour ( 1..12)
    
                     M      minute (00..59)
    
                     p      locale's AM or PM
    
                     r      time, 12-hour (hh:mm:ss [AP]M)
    
                     S      Second (00.00 .. 61.00).  There  is  a  fractional
                            part.
    
                     T      time, 24-hour (hh:mm:ss.xxxxxxxxxx)
    
                     +      Date  and  time,  separated  by  `+',  for example
                            `2004-04-28+22:22:05.0'.  This is a GNU extension.
                            The  time  is given in the current timezone (which
                            may be affected  by  setting  the  TZ  environment
                            variable).   The  seconds  field  includes a frac‐
                            tional part.
    
                     X      locale's time representation (H:M:S).  The seconds
                            field includes a fractional part.
    
                     Z      time  zone (e.g., EDT), or nothing if no time zone
                            is determinable
    
                     Date fields:
    
                     a      locale's abbreviated weekday name (Sun..Sat)
    
                     A      locale's full weekday name, variable length  (Sun‐
                            day..Saturday)
    
                     b      locale's abbreviated month name (Jan..Dec)
    
                     B      locale's  full  month name, variable length (Janu‐
                            ary..December)
    
                     c      locale's date and time (Sat Nov  04  12:02:33  EST
                            1989).  The format is the same as for ctime(3) and
                            so to preserve  compatibility  with  that  format,
                            there is no fractional part in the seconds field.
    
                     d      day of month (01..31)
    
                     D      date (mm/dd/yy)
    
                     h      same as b
    
                     j      day of year (001..366)
    
                     m      month (01..12)
    
                     U      week  number  of  year with Sunday as first day of
                            week (00..53)
    
                     w      day of week (0..6)
    
                     W      week number of year with Monday as  first  day  of
                            week (00..53)
    
                     x      locale's date representation (mm/dd/yy)
    
                     y      last two digits of year (00..99)
    
                     Y      year (1970...)