Some Linux tools get the job done but are starting to feel a bit creaky. Lately there has been a push to create new tools that:
- Have sane defaults (e.g. implied wildcards when performing searches)
- Are written in safer languages (e.g. Rust)
- Take advantage of multiple cores (e.g. GNU Parallel, fd)
I often come across these things and get excited about them but there are so many that I start to lose track. Here I'll keep tabs on some of the ones that I've found, and some notes about my experiences with them.
BTW, I refer to these tools as supplements instead of replacements because I think each tool has its niche. Also, while I might use these tools on my own system, if I write a script for wider deployment I usually fall back to the standard "old" tools for compatibility reasons.
fd: Supplement for find (and xargs and GNU Parallel)
find . -iname "*scriptname*" ! Replace that old syntax with something simpler like this:
What else does it do?
- It traverses directories in parallel so it should be faster than find on systems with SSDs or other very fast disks
- Supplements xargs: It has a feature like find's
-execto run commands against the files it finds. This command finds all zip files in and under the current directory and unzips them.
- Supplements GNU Parallel: Running commands against files can be done in parallel. The unzip command above will be run in parallel when the files are found fast enough.
fd -e zip -x unzip
Is it worth it?
In my tests, yes! hyperfine benchmarks show me a massive speed improvement even on spinning disks.
*.rbxlx files on my system with find takes about 7 seconds:
% hyperfine --warmup 3 'find . -name "*.rbxlx"' Benchmark #1: find . -name "*.rbxlx" Time (mean ± σ): 7.852 s ± 0.448 s [User: 219.8 ms, System: 2231.1 ms] Range (min … max): 7.178 s … 8.456 s 10 runs
Finding those same files with fd on my system takes about 330 milliseconds, a 21x improvement.
% hyperfine --warmup 3 'fd -e rbxlx' Benchmark #1: fd -e rbxlx Time (mean ± σ): 331.6 ms ± 15.3 ms [User: 591.2 ms, System: 1361.0 ms] Range (min … max): 318.2 ms … 371.9 ms 10 runs