Use wc on all subdirectories to count the sum of lines

How can I count all lines of all files in all subdirectories with wc?

cd mydir
wc -l *
..
11723 total

man wc suggests wc -l --files0-from=-, but I do not know how to generate the list of all files as NUL-terminated names

find . -print | wc -l --files0-from=-

did not work.


Solution 1:

You probably want this:

find . -type f -print0 | wc -l --files0-from=-

If you only want the total number of lines, you could use

find . -type f -exec cat {} + | wc -l

Solution 2:

Perhaps you are looking for exec option of find.

find . -type f -exec wc -l {} \; | awk '{total += $1} END {print total}'

Solution 3:

To count all lines for specific file extension u can use ,

find . -name '*.fileextension' | xargs wc -l

if you want it on two or more different types of files u can put -o option

find . -name '*.fileextension1' -o -name '*.fileextension2' | xargs wc -l

Solution 4:

Another option would be to use a recursive grep:

grep -hRc '' . | awk '{k+=$1}END{print k}'

The awk simply adds the numbers. The grep options used are:

   -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.)
   -h, --no-filename
          Suppress the prefixing of file names on  output.   This  is  the
          default  when there is only one file (or only standard input) to
          search.
   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

The grep, therefore, counts the number of lines matching anything (''), so essentially just counts the lines.

Solution 5:

I would suggest something like

find ./ -type f | xargs wc -l | cut -c 1-8 | awk '{total += $1} END {print total}'