Possible Duplicate:
How can I count the number of folders in a drive using Linux?

I have a really deep directory tree on my Linux box. I would like to count all of the files in that path, including all of the subdirectories.

For instance, given this directory tree:


If I pass in /home, I would like for it to return four files. Or, bonus points if it returns four files and two directories. Basically, I want the equivalent of right-clicking a folder on Windows and selecting properties and seeing how many files/folders are contained in that folder.

How can I most easily do this? I have a solution involving a Python script I wrote, but why isn't this as easy as running ls | wc or similar?

  • Not exactly what you're looking for, but to get a very quick grand total, if your locate database is up to date: locate /some/path | wc -l (or on my Mac: locate -c /some/path). But: this will also count files in /this/other/path/with/some/path, and will count the folders themselves. – Arjan Nov 13 '10 at 9:44
  • By the way, this is a different, but closely related problem (counting all the directories on a drive) and solution: superuser.com/questions/129088/… – Amanda Jun 20 '12 at 14:05

find . -type f | wc -l

find . -type f finds all files ( -type f ) in this ( . ) directory and in all sub directories, the filenames are then printed to standard out one per line.

This is then piped | into wc (word count) the -l option tells wc to only count lines of its input.

Together they count all your files.

  • 2
    This doesn't deal with the off-by-one error because of the last newline from the find output – RobertDeRose Feb 20 '19 at 22:22
  • for counting directories ONLY, use '-type d' instead of '-type f' :D – MevlütÖzdemir Mar 12 '19 at 13:49
  • 2
    When there are no files found, the result is 1 – Dylanthepiguy May 30 '19 at 3:15

The answers above already answer the question, but I'll add that if you use find without arguments (except for the folder where you want the search to happen) as in:

find . | wc -l

the search goes much faster, almost instantaneous, or at least it does for me. This is because the type clause has to run a stat() system call on each name to check its type - omitting it avoids doing so.

This has the difference of returning the count of files plus folders instead of only files, but at least for me it's enough since I mostly use this to find which folders have huge ammounts of files that take forever to copy and compress them. Counting folders still allows me to find the folders with most files, I need more speed than precision.

  • 1
    When there are no files found, the result is 1 – Dylanthepiguy May 30 '19 at 3:15
  • Huh, for me there is no difference in the speed – Simon Alford Mar 30 at 18:09

For files:

find -type f | wc -l

For directories:

find -mindepth 1 -type d | wc -l

They both work in the current working directory.

  • 1
    When there are no files found, the result is 1 – Dylanthepiguy May 30 '19 at 3:15

With bash 4+

shopt -s globstar
for file in **/*
  if [ -d "$file" ];then
  elif [ -f "$file" ];then
echo "number of files: $f"
echo "number of dirs: $d"

No need to call find twice if you want to search for files and directories


Slight update to accepted answer, if you want a count of dirs and such

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
  • 1
    On a Mac/BSD: find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn (Here, type %T is empty for a regular file, an asterisk for an executable file, or a slash for a folder; hence %HT is needed, or some extra text to avoid the space from not being counted, like > %T.) – Arjan Nov 13 '10 at 10:03
  • Gives me "find: illegal option -- e" on my 10.13.6 mac – K.-Michael Aye Oct 23 '18 at 1:22

Not the answer you're looking for? Browse other questions tagged or ask your own question.