Written in Rust ยท Open Source ยท MIT License

Fast parallel CLI tools
for the terminal

Drop-in alternatives to find, du, and grep built with parallel worker threads for speed on modern multi-core hardware.

Install all tools
$ curl -fsSL https://artools.io/install.sh | bash

macOS & Linux ยท x86_64 & arm64 ยท view script

macOS arm64
macOS x86_64
Linux x86_64 (musl)
Linux arm64 (musl)
Tools
arfindv0.2.9 replaces find

Parallel directory traversal with glob matching, built-in file types, size and age filters, sorting by name, size or time, and smart defaults that skip .git and node_modules automatically. Runs commands on results without a shell, and prints NUL-separated paths for xargs -0.

--name -t f/d/l --type --type-list --extension --size --older-than --sort --owner --group --empty --max-depth --exclude --exec -X batch --execdir -0 print0 --count -x one-fs -H hidden
ardiskv0.3.2 replaces du

Bottom-up parallel disk usage analysis. Shows the heaviest directories first with accurate rollup sizes using a single-pass DP algorithm. Also draws a tree view, lists the largest files, groups duplicates, breaks usage down by file type and counts inodes. Sizes in binary (KiB-style) or SI units, a live progress counter, JSON output for scripts, and a diff of two saved snapshots that shows what grew, shrank, appeared or disappeared.

--top N --max-depth --tree --bar --exclude --largest-files --by-type --duplicates --inodes --older-than --si -x one-fs --progress --json --diff
argrepv0.3.4 replaces grep

Parallel text search across file trees. Full regex by default, with -F for literal strings. Skips binaries and special files, searches gzip archives, filters by built-in file types, and emits JSON Lines or NUL-separated names for scripts. Works as a drop-in for common grep workflows.

-i case -S smart -e / -f -F literal -w word -x line -n lines -v invert -o matched -r replace -A/-B/-C -l files -c count -m limit -q quiet -z gzip -0 null --json --type --type-list --stats --max-filesize --include --exclude --exclude-dir
Usage
arfind Find files by name, type, or size
# Find all Rust source files
arfind . --name "*.rs"

# Find files larger than 100MB
arfind . -t f --size 100MB

# The 20 largest files, biggest first
arfind . -t f --sort size --reverse | head -20

# Count empty files in a directory
arfind . -t f --empty --count

# Python files untouched for six months
arfind . --type python --older-than 6mo

# Root-owned leftovers in a shared directory
arfind /var/shared -t f --owner root

# Run a command per result, no shell involved (preview first)
arfind /var/log --name "*.log" --older-than 90d --dry-run --exec rm

# On trees others can write to, avoid the symlink race
sudo arfind /tmp -t f --older-than 7d --execdir rm

# Safe pipelines with any file name
arfind . --type rust -0 | xargs -0 -n1 argrep -l0 TODO
ardisk Analyze disk usage
# Top 10 heaviest directories
ardisk . --top 10

# Same, as a tree, two levels deep
ardisk . --tree --max-depth 2

# How much space do .mp4 files use?
ardisk ~/Movies --include "*.mp4" --summarize

# Show only directories over 1GB
ardisk / --threshold 1GB

# The 20 largest files nobody touched for a year
ardisk ~ --largest-files 20 --older-than 1y

# Which file types take the space?
ardisk ~ --by-type

# Find duplicate files (report only)
ardisk ~ --duplicates --min-size 1MB

# Out of inodes? Count them, staying on this volume
ardisk ~ -x --inodes

# Sizes in powers of 1000, like Finder and drive vendors
ardisk ~ --si --top 10

# Live counter on a big scan, machine-readable result
ardisk /data --progress --json > usage.json

# What changed since last week? Save full snapshots, then compare
ardisk /data --json --top 0 > after.json
ardisk --diff before.json after.json --threshold 10MB
argrep Search text in files or stdin
# Search Rust files case-insensitively
argrep "todo" . --include "*.rs" -i -n

# List files containing errors
argrep "error" /var/log -l

# Use as a grep replacement in pipes
ps aux | argrep "rust"

# Literal search (skip regex interpretation)
argrep -F "connection refused" /var/log

# Whole-word match ("cat", not "category")
argrep -w "cat" .

# Quiet mode โ€” just check the exit code
argrep -q "TODO" src/ && echo "found"

# Print only the matched text, not the whole line
echo 'foo bar foo' | argrep -o "foo"

# Stop after the first match โ€” great for CI checks
argrep -m 1 "panic!" src/

# Skip generated/vendor directories
argrep "TODO" . --exclude-dir node_modules

# Search only Rust and Python files
argrep "unsafe" . --type rust --type python

# Which types exist?
argrep --type-list

# Don't open huge dumps and bundles
argrep "TODO" . --max-filesize 10M

# Search rotated, gzipped logs
argrep -z "timeout" /var/log

# Preview a rename (files are never changed)
argrep "old_name" src/ -r "new_name" -n

# JSON Lines for scripts and editors
argrep "TODO" . --json | jq 'select(.type=="match")'

# NUL-separated file names for xargs -0
argrep -l0 "FIXME" . | xargs -0 wc -l