Fast file counting for spinning rust, in rust.
ffcnt's sole purpose is to provide a faster alternative to find /some/path/ -type f | wc -l
.
It achieves that by looking up the extent map of directories and reordering recursion into the directory tree by the physical offset of the first extent of each directory.
This greatly reduces disk seeks.
fiemap
ioctl on directories.find
.You can test filesystem support with the filefrag
tool.
```
$ filefrag /tmp/ /tmp/: 3 extents found
$ filefrag /mnt/test/ /mnt/test/: FIBMAP unsupported ```
You can find prebuilt x86_64-linux-glibc binaries without debug information under releases. For troubleshooting and other environments you'll have to build your own.
cargo build --release
Idle system:
```
196608
real 0m23.889s user 0m1.233s sys 0m2.127s
196608
real 2m31.562s user 0m0.557s sys 0m3.860s ```
Busy system with mixed read/write workload. Differences in file counts arose due to writes happening in the meantime:
```
4411262
real 10m36.288s user 0m3.656s sys 0m7.588s
4412101
real 45m54.955s user 0m3.212s sys 0m12.044s ```
Both tests were performed on HDDs and the files were spread over 65536 directories with a nesting depth of 2, i.e. a branching factor of 256.