Recursively counting files in a Linux directory
How can I recursively count files in a Linux directory?
I found this:
find DIR_NAME -type f ¦ wc -l
But when I run this it returns the following error.
find: paths must precede expression: ¦
This should work:
find DIR_NAME -type f | wc -l
-type fto include only files.
findcommand's standard output to
wccommand's standard input.
wc(short for word count) counts newlines, words and bytes on its input (docs).
-lto count just newlines.
.to execute the command in the current folder.
- You can also remove the
-type fto include directories (and symlinks) in the count.
- It's possible this command will overcount if filenames can contain newline characters.
Explanation of why your example does not work:
In the command you showed, you do not use the "Pipe" (
|) to kind-of connect two commands, but the broken bar (
¦) which the shell does not recognize as a command or something similar. That's why you get that error message.
Read more... Read less...
For the current directory:
find -type f | wc -l
If you want a breakdown of how many files are in each dir under your current dir:
for i in */ .*/ ; do echo -n $i": " ; (find "$i" -type f | wc -l) ; done
That can go all on one line, of course. The parenthesis clarify whose output
wc -l is supposed to be watching (
find $i -type f in this case).
You can use
after installing the tree package with
$ sudo apt-get install tree
(on a Debian / Mint / Ubuntu Linux machine).
The command shows not only the count of the files, but also the count of the directories, separately. The option -L can be used to specify the maximum display level (which, by default, is the maximum depth of the directory tree).
Hidden files can be included too by supplying the
-a option .
On my computer,
rsync is a little bit faster than
find | wc -l in the accepted answer:
$ rsync --stats --dry-run -ax /path/to/dir /tmp Number of files: 173076 Number of files transferred: 150481 Total file size: 8414946241 bytes Total transferred file size: 8414932602 bytes
The second line has the number of files, 150,481 in the above example. As a bonus you get the total size as well (in bytes).
- the first line is a count of files, directories, symlinks, etc all together, that's why it is bigger than the second line.
-nfor short) option is important to not actually transfer the files!
- I used the
-xoption to "don't cross filesystem boundaries", which means if you execute it for
/and you have external hard disks attached, it will only count the files on the root partition.
Since filenames in UNIX may contain newlines (yes, newlines),
wc -l might count too many files. I would print a dot for every file and then count the dots:
find DIR_NAME -type f -printf "." | wc -c