Use wc on all subdirectories to count the sum of lines

LinuxBashText FilesConsole Application

Linux Problem Overview


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.

Linux Solutions


Solution 1 - Linux

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 - Linux

Perhaps you are looking for exec option of find.

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

Solution 3 - Linux

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 - Linux

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 - Linux

I would suggest something like

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

Solution 6 - Linux

Based on ДМИТРИЙ МАЛИКОВ's answer:

Example for counting lines of java code with formatting:

one liner

find . -name *.java -exec wc -l {} \; | awk '{printf ("%3d: %6d %s\n",NR,$1,$2); total += $1} END {printf ("     %6d\n",total)}'

awk part:

{ 
  printf ("%3d: %6d %s\n",NR,$1,$2); 
  total += $1
} 
END {
  printf ("     %6d\n",total)
}

example result

  1:    120 ./opencv/NativeLibrary.java
  2:     65 ./opencv/OsCheck.java
  3:      5 ./opencv/package-info.java
        190

Solution 7 - Linux

Bit late to the game here, but wouldn't this also work? find . -type f | wc -l

This counts all lines output by the 'find' command. You can fine-tune the 'find' to show whatever you want. I am using it to count the number of subdirectories, in one specific subdir, in deep tree: find ./*/*/*/*/*/*/TOC -type d | wc -l . Output: 76435. (Just doing a find without all the intervening asterisks yielded an error.)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJonas SteinView Question on Stackoverflow
Solution 1 - Linuxgniourf_gniourfView Answer on Stackoverflow
Solution 2 - LinuxДМИТРИЙ МАЛИКОВView Answer on Stackoverflow
Solution 3 - LinuxAnkurView Answer on Stackoverflow
Solution 4 - LinuxterdonView Answer on Stackoverflow
Solution 5 - LinuxsgeView Answer on Stackoverflow
Solution 6 - LinuxWolfgang FahlView Answer on Stackoverflow
Solution 7 - LinuxCronkView Answer on Stackoverflow