242

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:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

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?

omghai2u
  • 2,950

5 Answers5

405

find . -type f | wc -l

Explanation:
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.

Nifle
  • 34,998
51

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.

25

For files:

find -type f | wc -l

For directories:

find -mindepth 1 -type d | wc -l

They both work in the current working directory.

cYrus
  • 22,335
9

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
Rich Homolka
  • 32,350
8

With bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
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

user31894
  • 2,937