Fast file counting and listing for spinning rust, in rust.
ffcnt's purpose is to provide a faster alternatives to some common filesystem operations as a frontend for the platter-walk crate.
ffcnt --type f
replaces find -type f | wc -l
ffcnt --type f --ls --leaf-order content
replaces find -type f
and returns files in optimized order for reading ffcnt -s
replaces du -s --apparent-size
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
``` fast file counting 0.3.0
USAGE: ffcnt [FLAGS] [OPTIONS] [dirs]...
FLAGS: -h, --help Prints help information --ls list files --prefetch attempt to prefetch directory indices from underlying mount device. requires read permission on device -s sum apparent length of matched files. Only counts hardlinked files once. Does not follow symlinks. Implies --leaf-order inode. -V, --version Prints version information
OPTIONS:
--leaf-order
ARGS:
Idle system:
``` $ echo 3 > /proc/sys/vm/drop_caches ; time find /tmp/foo/ -type f | wc -l 826536
real 0m52.289s user 0m0.680s sys 0m4.361s
$ echo 3 > /proc/sys/vm/drop_caches ; time ffcnt /tmp/foo/ --type f files: 826536
real 0m17.072s user 0m1.230s sys 0m2.190s
$ echo 3 > /proc/sys/vm/drop_caches ; time sudo ffcnt /tmp/foo/ --prefetch --type f files: 826536
real 0m13.311s user 0m2.029s sys 0m1.440s ```
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 with a directory structure of at least 2 nesting levels and a branching factor of 256