find(1) . -name '*.py' -printf "x" | grep(1) -oc x
search for files in a directory hierarchy
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
-name pattern
       Base of file name (the path with the leading directories removed) matches shell  pattern  pattern.
       The  metacharacters  (`*',  `?',  and  `[]')  match a `.' at the start of the base name (this is a
       change in findutils-4.2.2; see section STANDARDS CONFORMANCE below).  To ignore  a  directory  and
       the  files  under  it,  use  -prune;  see  an example in the description of -path.  Braces are not
       recognised as being special, despite the fact that some shells including Bash imbue braces with  a
       special  meaning  in  shell  patterns.   The  filename  matching  is performed with the use of the
       fnmatch(3) library function.   Don't forget to enclose the pattern in quotes in order  to  protect
       it from expansion by the shell.
-printf format
       True; print format on the standard output, interpreting `\' escapes  and  `%'  directives.   Field
       widths  and precisions can be specified as with the `printf' C function.  Please note that many of
       the fields are printed as %s rather than %d, and this may mean that flags don't work as you  might
       expect.   This  also  means  that  the  `-'  flag does work (it forces fields to be left-aligned).
       Unlike -print, -printf does not add a  newline  at  the  end  of  the  string.   The  escapes  and
       directives are:

       \a     Alarm bell.

       \b     Backspace.

       \c     Stop printing from this format immediately and flush the output.

       \f     Form feed.

       \n     Newline.

       \r     Carriage return.

       \t     Horizontal tab.

       \v     Vertical tab.

       \0     ASCII NUL.

       \\     A literal backslash (`\').

       \NNN   The character whose ASCII code is NNN (octal).

       A  `\' character followed by any other character is treated as an ordinary character, so they both
       are printed.

       %%     A literal percent sign.

       %a     File's last access time in the format returned by the C `ctime' function.

       %Ak    File's last access time in the format specified by k, which is either `@'  or  a  directive
              for  the  C  `strftime' function.  The possible values for k are listed below; some of them
              might not be available on all systems, due to differences in `strftime' between systems.

              @      seconds since Jan. 1, 1970, 00:00 GMT, with fractional 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)

              +      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 fractional part.

              X      locale's time representation (H:M:S)

              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 (Sunday..Saturday)

              b      locale's abbreviated month name (Jan..Dec)

              B      locale's full month name, variable length (January..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...)

       %b     The amount of disk space used for this  file  in  512-byte  blocks.  Since  disk  space  is
              allocated  in  multiples  of the filesystem block size this is usually greater than %s/512,
              but it can also be smaller if the file is a sparse file.

       %c     File's last status change time in the format returned by the C `ctime' function.

       %Ck    File's last status change time in the format specified by k, which is the same as for %A.

       %d     File's depth in the directory tree; 0 means the file is a command line argument.

       %D     The device number on which the file exists (the st_dev field of struct stat), in decimal.

       %f     File's name with any leading directories removed (only the last element).

       %F     Type of the filesystem the file is on; this value can be used for -fstype.

       %g     File's group name, or numeric group ID if the group has no name.

       %G     File's numeric group ID.

       %h     Leading directories of file's name (all but the last element).  If the file  name  contains
              no slashes (since it is in the current directory) the %h specifier expands to ".".

       %H     Command line argument under which file was found.

       %i     File's inode number (in decimal).

       %k     The  amount of disk space used for this file in 1K blocks. Since disk space is allocated in
              multiples of the filesystem block size this is usually greater than  %s/1024,  but  it  can
              also be smaller if the file is a sparse file.

       %l     Object of symbolic link (empty string if file is not a symbolic link).

       %m     File's  permission  bits (in octal).  This option uses the `traditional' numbers which most
              Unix implementations use, but if your particular implementation uses an unusual ordering of
              octal  permissions  bits,  you will see a difference between the actual value of the file's
              mode and the output of %m.   Normally you will want to have a leading zero on this  number,
              and to do this, you should use the # flag (as in, for example, `%#m').

       %M     File's permissions (in symbolic form, as for ls).  This directive is supported in findutils
              4.2.5 and later.

       %n     Number of hard links to file.

       %p     File's name.

       %P     File's name with the name of the command line argument under which it was found removed.

       %s     File's size in bytes.

       %S     File's sparseness.  This is calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value
              you  will  get  for  an  ordinary  file  of a certain length is system-dependent.  However,
              normally sparse files will have values less than 1.0, and files which use  indirect  blocks
              may  have  a  value  which  is  greater than 1.0.   The value used for BLOCKSIZE is system-
              dependent, but is usually 512 bytes.   If the file size  is  zero,  the  value  printed  is
              undefined.   On systems which lack support for st_blocks, a file's sparseness is assumed to
              be 1.0.

       %t     File's last modification time in the format returned by the C `ctime' function.

       %Tk    File's last modification time in the format specified by k, which is the same as for %A.

       %u     File's user name, or numeric user ID if the user has no name.

       %U     File's numeric user ID.

       %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

       %Y     File's type (like %y), plus follow symlinks: L=loop, N=nonexistent

       A `%' character followed by any other character is discarded, but the other character  is  printed
       (don't  rely  on  this,  as further format characters may be introduced).  A `%' at the end of the
       format argument causes undefined behaviour  since  there  is  no  following  character.   In  some
       locales,  it  may hide your door keys, while in others it may remove the final page from the novel
       you are reading.

       The %m and %d directives support the # , 0 and + flags, but the other directives do not,  even  if
       they  print numbers.  Numeric directives that do not support these flags include G, U, b, D, k and
       n.  The `-' format flag is supported and changes the alignment of  a  field  from  right-justified
       (which is the default) to left-justified.

       See  the  UNUSUAL  FILENAMES section for information about how unusual characters in filenames are
       handled.
Pipelines
    A  pipeline is a sequence of one or more commands separated by one of the control operators | or |&.  The
    format for a pipeline is:

           [time [-p]] [ ! ] command [ [||&] command2 ... ]

    The standard output of command is connected  via  a  pipe  to  the  standard  input  of  command2.   This
    connection  is performed before any redirections specified by the command (see REDIRECTION below).  If |&
    is used, the standard error of command is connected to command2's standard input through the pipe; it  is
    shorthand  for  2>&1  |.   This  implicit  redirection  of  the  standard  error  is  performed after any
    redirections specified by the command.

    The return status of a pipeline is the exit status of the last command, unless  the  pipefail  option  is
    enabled.   If  pipefail  is  enabled,  the  pipeline's return status is the value of the last (rightmost)
    command to exit with a non-zero status, or zero if all commands exit successfully.  If the reserved  word
    !   precedes  a  pipeline, the exit status of that pipeline is the logical negation of the exit status as
    described above.  The shell waits for all commands in the pipeline to terminate before returning a value.

    If the time reserved word precedes a pipeline, the elapsed as well as user and system  time  consumed  by
    its execution are reported when the pipeline terminates.  The -p option changes the output format to that
    specified by POSIX.  When the shell is in posix mode, it does not recognize time as a  reserved  word  if
    the  next  token begins with a `-'.  The TIMEFORMAT variable may be set to a format string that specifies
    how the timing information should be displayed; see the description of TIMEFORMAT under  Shell  Variables
    below.

    When the shell is in posix mode, time may be followed by a newline.  In this case, the shell displays the
    total user and system time consumed by the shell and its children.  The TIMEFORMAT variable may  be  used
    to specify the format of the time information.

    Each command in a pipeline is executed as a separate process (i.e., in a subshell).
print lines matching a pattern
-o, --only-matching
       Print  only  the  matched  (non-empty) parts of a matching line, with each such part on a separate
       output line.
General Output Control
    -c, --count
           Suppress normal output; instead print a count of matching lines for each input file.  With the -v,
           --invert-match option (see below), count non-matching lines.  (-c is specified by POSIX.)
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus
(-) is given as file name) for lines containing a match to the given PATTERN.  By  default,  grep  prints
the matching lines.
source manpages: findgrep