Query every file on every drive — by name, regex, extension, size, date, attributes, duplicates — with full boolean logic. Results in under a millisecond. Your filesystem is a database.
10 million files across multiple drives. Agents and workflows that navigate them with Get-ChildItem, os.walk, or glob are flying blind — slow, fragile, and context-starved. everyfile changes that.
Backed by Voidtools Everything's real-time NTFS index, every query resolves in < 1 ms regardless of drive size. No recursion. No indexing wait. An agent goes from guessing paths to instant, structured answers across your entire filesystem.
# Find every test file across all drives — Python and JS/TS — in one query
ev "regex:^test_.+\.py$ | regex:^spec_.+\.(js|ts)$" -n 8test_controllers.py 2026-04-18 18:40 E:\Projects\chatbot\tests\controllers 19.7 KB
test_credentials.py 2026-04-18 18:33 E:\Projects\filesearch\.venv\Lib\site-packages 7.8 KB
test_platform.py 2026-04-18 18:33 E:\Projects\filesearch\.venv\Lib\site-packages 11.4 KB
test_backends.py 2026-04-18 18:33 E:\Projects\filesearch\.venv\Lib\site-packages 1.2 KB
test_typeops.py 2026-04-18 08:30 E:\Projects\filesearch\.venv\Lib\site-packages 3.9 KB
test_tuples.py 2026-04-18 08:30 E:\Projects\filesearch\.venv\Lib\site-packages 1.1 KB
test_structs.py 2026-04-18 08:30 E:\Projects\filesearch\.venv\Lib\site-packages 3.9 KB
test_statements.py 2026-04-18 08:30 E:\Projects\filesearch\.venv\Lib\site-packages 5.5 KB
8 of 20,755 results for "regex:^test_.+\.py$ | regex:^spec_.+\.(js|ts)$"
# Find duplicate DLLs wasting disk space — across every drive, instantly
ev "sizedupe: ext:dll size:>1mb" -n 4graphics_engine.dll 2024-03-31 05:58 C:\Program Files\NVIDIA\RTXVoice 402.5 MB
graphics_engine.dll 2024-03-31 05:58 C:\Program Files\NVIDIA\Installer2\nv 402.5 MB
browser_core.dll 2026-04-16 03:51 C:\Program Files\Edge\Application 303.8 MB
browser_core.dll 2026-04-16 03:51 C:\Program Files\Edge\Optimized 303.8 MB
4 of 11,800 results for "sizedupe: ext:dll size:>1mb"
├ size 1.4 GB
└ names browser_core.dll×2 graphics_engine.dll×2
Three integration surfaces cover every use case:
| Surface | Best for |
|---|---|
CLI (ev) |
Shell scripts, pipelines, terminal power users |
| Python API | Scripts and tools that iterate results programmatically |
| Section | What's inside | |
|---|---|---|
| Intro | What is Everything? | Why Everything beats Windows Search, benchmark comparison |
| Features | Capabilities at a glance | |
| Setup | Install | |
| Prerequisites | Windows, Python ≥ 3.11, Everything running | |
| CLI | pip install everyfile — ev command |
|
| Python API | from everyfile import search |
|
| Agent Skill | npx skills add LouisGameDev/everyfile |
|
| OpenClaw | Skill for OpenClaw gateway agents | |
| Install from source | Editable dev install | |
| Command aliases | ev, every, everyfile |
|
| CLI | Quick Start | First commands to try |
| Using Results | VS Code, delete, copy, grep, jq, pagination | |
| Examples | Sort, filter, regex, count, pipes, ev filter, ev pick, output modes |
|
| CLI Reference | Fields | -f / --fields options and groups |
| Sorting | --sort options, default order |
|
ev filter flags |
Structured NDJSON filtering flags | |
| Search Syntax | Operators, wildcards, functions, macros, size/date filters | |
| Instance Management | Multi-version Everything, --instance, env var |
|
| Service Info | --version, --info, --instances |
|
| Python API | Python API | search(), count(), Cursor, Row, Everything class, error handling |
| Internals | Versioning | CalVer scheme, release workflow |
| Architecture | Module layout, IPC approach | |
| Development | Clone, install, type-check, test | |
| See Also | External links | |
| License | MIT |
A zero-dependency Python CLI for Voidtools Everything search.
ev ext:py path:fixtures -n 5views.py 2026-04-17 00:00 webapp\src\api 652 B
models.py 2026-04-16 23:00 webapp\src\db 608 B
serializers.py 2026-04-16 22:00 webapp\src\api 783 B
middleware.py 2026-04-16 21:00 webapp\src 1011 B
admin.py 2026-04-16 20:00 webapp\src 523 B
5 of 18 results for "ext:py path:fixtures"
├ size 3.5 KB
└ names admin.py middleware.py models.py serializers.py views.py
Everything by Voidtools is a free, lightweight file search engine for Windows. When you install it, Everything reads the Master File Table (MFT) of every NTFS volume on your system and builds a complete filename index — typically in under a second, even for drives with millions of files. It then monitors the USN Change Journal to keep that index current in real time. The result: every file and folder on your machine is searchable instantly.
Everything runs as a small background process (~15 MB of RAM for 1 million files) and provides a rich search syntax for filtering by extension, size, date, path, content, duplicates, and more.
| Everything | Windows Search | Get-ChildItem -Recurse |
|
|---|---|---|---|
| Speed | ~10 ms for any query | Seconds to minutes; often misses files | Traverses the entire filesystem every time |
| Completeness | Every file and folder on all NTFS volumes | Only indexes "included locations"; skips system dirs, app data, etc. | Complete, but slow |
| Index size | ~75 MB for 1 M files | Hundreds of MB to GB, with CPU spikes during re-indexing | No index (brute-force walk) |
| Startup | Indexes a fresh 1 M-file drive in ~1 s | Initial indexing can take hours | N/A |
| Advanced filters | ext:, size:, dm:, dupe:, regex:, content:, parent:, macros |
Basic filters, inconsistent behaviour | -Filter, -Include flags |
| Real-time updates | Via NTFS USN journal — instant | Periodic, often delayed minutes | N/A |
| Resource usage | ~15 MB RAM | Heavy (SearchIndexer.exe) | Spikes CPU/disk during scan |
Run this in PowerShell to compare a full-drive extension search:
# Built-in: traverses every directory on C:\ (slow)
Measure-Command { Get-ChildItem C:\ -Recurse -Filter *.py -ErrorAction SilentlyContinue } | Select-Object TotalSeconds
# Everything via ev: queries the pre-built index (instant)
Measure-Command { ev ext:py -l } | Select-Object TotalSecondsTypical results on a drive with ~1 M files:
| Method | Time |
|---|---|
Get-ChildItem -Recurse |
30 – 120 s |
ev ext:py -l |
0.02 – 0.1 s |
The difference grows with drive size. On multi-drive systems with millions of files, Everything stays under 100 ms while filesystem traversals can take minutes.
- Instant search — queries Everything's indexed database, returns results in milliseconds
- Pipe-friendly — human-readable output on stderr, NDJSON on stdout when piped
- Pipe composition — chain
evcommands to filter results without re-querying - Zero dependencies — stdlib + ctypes only, no DLL needed
- Everything search syntax — full pass-through (
ext:,dm:,size:,content:,dupe:, regex, wildcards, macros) - Importable Python API — use as a library with typed
Cursor/Rowobjects, DB-API 2.0 semantics - Multi-instance support — works with Everything 1.4, 1.5, and 1.5a side by side
- Pure Python IPC — communicates via ctypes
SendMessageW/WM_COPYDATA, no DLL required
- Windows — Everything uses NTFS and Windows IPC
- Python ≥ 3.11
- Voidtools Everything running in the background
New to Everything? Download Everything 1.5a (recommended). It's the latest alpha with the most features, runs alongside stable versions, and is what most power users run. Install it, let it index your drives (takes ~1 second), and leave it running in the system tray.
Pick what you need — each layer builds on the one before it.
pip install everyfileThis gives you the ev command (plus every and everyfile as aliases):
ev ext:py # find all Python files instantly
ev ext:log size:>1mb dm:today # large log files modified today
ev server.py -n 1 -l | code - # open first match in VS CodeSame package, just import it:
from everyfile import search, count
for row in search("ext:py dm:today", limit=10):
print(row.name, row.full_path)
print(f"Total Python files: {count('ext:py')}")Install to any Agent Skills-compatible agent (Copilot, Claude Code, Cursor, Codex, and 40+ more):
npx skills add LouisGameDev/everyfile -gOr install from a local clone:
npx skills add ./path/to/everyfile -gThe skill teaches agents when and how to use ev and the Python API — with search syntax, safety guidelines, and decision logic included.
If you run OpenClaw, you can give your agents instant file search on Windows.
Install the skill (via ClawHub or manually):
openclaw skills install everyfileOr copy the skill folder manually into your workspace:
cp -r .agents/skills/everyfile <workspace>/skills/everyfileInstall the Python package (the skill gates on the ev binary):
pip install everyfileThe skill auto-gates on win32 and requires ev on PATH. Once installed, your OpenClaw agents will use Everything for all file discovery instead of slow filesystem traversals.
git clone https://github.com/LouisGameDev/everyfile.git
cd everyfile
pip install -e ".[dev]" # editable install with dev toolsAll three run the same binary. Examples in this README use ev.
everyfile ext:py # full name
every ext:py # short form
ev ext:py # shortest — recommended for daily useev ext:py # all Python files
ev ext:py dm:today # Python files modified today
ev ext:py -n 5 # 5 most recently modified
ev ext:py --sort size -d # largest first
ev --count ext:py # just the total countThe -l flag outputs one full path per line — perfect for feeding into other tools.
Find a file by name and open it instantly:
code $(ev server.py -n 1 -l)
# opens C:\Projects\webapp\src\server.py in VS Code# Open all recently modified Python files in VS Code
ev ext:py dm:today -l | ForEach-Object { code $_ }# Clean up temp files
ev ext:tmp -l | ForEach-Object { Remove-Item $_ }
# With confirmation prompt
ev ext:tmp -l | ForEach-Object { Remove-Item $_ -Confirm }# Copy all project configs to a backup folder
ev "ext:toml|ext:cfg path:Projects" -l | ForEach-Object { Copy-Item $_ D:\Backup\ }
# Move all .log files to archive
ev ext:log -l | ForEach-Object { Move-Item $_ D:\Archive\Logs\ }# Total line count across all Python files in a project
ev "ext:py path:webapp\src" -l | ForEach-Object { Get-Content $_ } | Measure-Object -Line
Lines Words Characters Property
----- ----- ---------- --------
331# Find TODO comments in recently changed Python files
ev "ext:py dm:thisweek" -l | ForEach-Object { Select-String -Path $_ -Pattern "TODO" }
C:\Projects\webapp\src\api\views.py:42: # TODO: add pagination
C:\Projects\webapp\src\db\models.py:17: # TODO: add index# Skip first 10, show next 5
ev ext:py -l | Select-Object -Skip 10 -First 5
# Or use --offset and -n directly
ev ext:py --offset 10 -n 5# Get names of large files as a JSON array
ev "ext:py size:>100kb" -j | jq -s '[.[].name]'
["generate_parser.py", "codegen.py", "transformer.py"]Find the 5 largest Python files:
ev ext:py path:fixtures -n 5 --sort size -d -f name,sizemiddleware.py 1011 B
utils.py 824 B
serializers.py 783 B
test_views.py 718 B
views.py 652 B
5 of 18 results for "ext:py path:fixtures" │ sorted by size ↓
├ size 3.9 KB
└ names middleware.py serializers.py test_views.py utils.py views.py
Search functions compose with AND. Find Python files over 500 bytes:
ev "ext:py size:>500" path:fixtures -n 5 -f name,size,pathviews.py 652 B webapp\src\api
models.py 608 B webapp\src\db
serializers.py 783 B webapp\src\api
middleware.py 1011 B webapp\src
admin.py 523 B webapp\src
5 of 10 results for "ext:py size:>500 path:fixtures"
├ size 3.5 KB
└ names admin.py middleware.py models.py serializers.py views.py
Show name, path, size, and date in any order you want:
ev "ext:py path:fixtures" -n 5 -f name,path,size,date_modifiedviews.py webapp\src\api 652 B 2026-04-17 00:00
models.py webapp\src\db 608 B 2026-04-16 23:00
serializers.py webapp\src\api 783 B 2026-04-16 22:00
middleware.py webapp\src 1011 B 2026-04-16 21:00
admin.py webapp\src 523 B 2026-04-16 20:00
5 of 18 results for "ext:py path:fixtures"
├ size 3.5 KB
└ names admin.py middleware.py models.py serializers.py views.py
Use | to combine extensions. Quote the pipe so the shell doesn't intercept it:
ev 'ext:log|ext:tmp path:fixtures' -n 5 -f name,size,pathcache.tmp 195.3 KB webapp
app-2026-04-14.log 258.8 KB webapp\logs
debug.log 12.6 KB webapp\logs
3 of 3 results for "ext:log|ext:tmp path:fixtures"
├ size 466.7 KB
└ names app-2026-04-14.log cache.tmp debug.log
Find test files using Everything's regex: function:
ev 'regex:^test_.*\.py$ path:fixtures' -n 5 -f name,pathtest_views.py webapp\tests
test_serializers.py webapp\tests
test_auth.py webapp\tests
test_utils.py toolkit\tests
4 of 4 results for "regex:^test_.*\.py$ path:fixtures"
└ names test_auth.py test_serializers.py test_utils.py test_views.py
size:empty locates zero-byte placeholder files:
ev 'size:empty ext:py path:fixtures' -f name,size,path__init__.py 0 B webapp\tests
__init__.py 0 B webapp\src\db
__init__.py 0 B webapp\src\api
__init__.py 0 B webapp\src
4 of 4 results for "size:empty ext:py path:fixtures"
├ size 0 B
└ names __init__.py×4
Just the number — no results, no table:
ev --count 'ext:py path:fixtures'everything: 18 results for "ext:py path:fixtures"
When you pipe ev into ev, the second invocation filters locally (no re-query).
Start broad, then narrow to API:
ev 'ext:py path:webapp\src' -n 20 -j | ev '!__init__' | ev 'path:api' -f name,pathviews.py C:\Projects\webapp\src\api
serializers.py C:\Projects\webapp\src\api
urls.py C:\Projects\webapp\src\api
permissions.py C:\Projects\webapp\src\api
ev filter applies typed conditions to NDJSON fields — like jq but zero-dep.
Find project source files > 5 KB:
ev 'ext:py path:webapp\src' -f all -j | ev filter --size-gt 5000 --is-file | ev pick name size{"name":"views.py","size":8412}
{"name":"models.py","size":6553}
{"name":"serializers.py","size":7201}
{"name":"admin.py","size":5890}
{"name":"middleware.py","size":6104}
Extract only the fields you need from NDJSON:
ev 'ext:py path:webapp\src' -n 5 -f all -j | ev pick name size{"name":"views.py","size":8412}
{"name":"models.py","size":6553}
{"name":"urls.py","size":345}
{"name":"__init__.py","size":0}
{"name":"admin.py","size":5890}
| Flag | Description | Use case |
|---|---|---|
| (default) | Human table on stderr, NDJSON on stdout when piped | Interactive browsing |
-l / --list |
One full path per line | ForEach-Object, $(...) |
-0 / --null |
Null-separated full paths | Paths with special characters |
-j / --json |
Force NDJSON to stdout | Processing with ev filter/ev pick/jq |
ev ext:py path:fixtures -n 3 -lwebapp\src\api\views.py
webapp\src\db\models.py
webapp\src\api\serializers.py
-f / --fields controls both the human-readable stderr display and NDJSON output fields.
ev ext:py -f name,size # display and NDJSON: name + size
ev ext:py -f all # all fields
ev ext:py -f dates,meta # default + date + metadata groupsRun ev --help-fields for the full list:
available fields (use with -f/--fields):
* name file or folder name
* path parent directory path
full_path complete path including filename
ext file extension (without dot)
* size file size in bytes
date_created creation timestamp
* date_modified last modified timestamp
date_accessed last accessed timestamp
date_run last run timestamp
date_recently_changed recently changed timestamp
run_count number of times file was executed
attributes file system attributes string
is_file true if result is a file (derived)
is_folder true if result is a folder (derived)
hl_name highlighted matching name
hl_path highlighted matching path
hl_full_path highlighted matching full path
* = included in default display
groups:
default name, path
all every available column
dates date_created, date_modified, date_accessed
meta size, ext, attributes, is_file, is_folder
hl hl_name, hl_path, hl_full_path
Default sort is date modified descending (newest first), so -n 5 gives the 5 most recently modified matches.
ev ext:py # newest first (default)
ev ext:py --sort name # alphabetical
ev ext:py --sort size -d # largest first
ev ext:py --sort created # oldest created firstSort fields: name, path, size, ext, created, modified, accessed, run-count, date-run, recently-changed, attributes.
| Flag | Description |
|---|---|
--name GLOB |
Glob match on name |
--path GLOB |
Glob match on path |
--ext .EXT |
Exact extension match |
--size-gt N |
Size > N bytes |
--size-lt N |
Size < N bytes |
--modified-after DATE |
Modified after ISO date |
--modified-before DATE |
Modified before ISO date |
--created-after DATE |
Created after ISO date |
--created-before DATE |
Created before ISO date |
--is-file |
Only files |
--is-folder |
Only folders |
--attr CHARS |
Require attribute chars (e.g. RHA) |
The query is passed verbatim to Everything. Full syntax reference:
Operators: space=AND |=OR !=NOT < >=group " "=exact phrase
Wildcards: *=any chars ?=one char
Functions: ext:py size:>1mb dm:today parent:C:\Dev content:TODO
dc: da: dr: rc: depth: len: dupe: child: childcount:
Modifiers: case: nocase: regex: path: ww: file: folder:
Macros: audio: video: doc: pic: zip: exe:
Size: size:1kb..10mb size:>1gb size:empty size:tiny..huge
Dates: dm:today dm:thisweek dc:yesterday da:last2weeks
Shell metacharacters need quoting:
ev 'foo|bar' # OR (quote the pipe)
ev '!secret' # NOT (quote the bang)
ev 'size:>1mb' # function (quote the >)
ev ext:py dm:today # no special chars — no quoting neededMultiple Everything versions can run side-by-side. The CLI auto-detects instances in priority order: 1.5a → 1.5 → 1.4 → default.
ev --instances # list running instances
ev --instance 1.4 ext:py # query via Everything 1.4
# Persist your choice
$env:EVERYTHING_INSTANCE = "1.5a" # session
[System.Environment]::SetEnvironmentVariable('EVERYTHING_INSTANCE', '1.5a', 'User') # permanentPriority: --instance flag > $EVERYTHING_INSTANCE env var > auto-detect.
$ ev --version
everyfile 2026.04.15 (Python 3.13.5) / Everything 1.5.0.1404
Instance: 1.5a (via auto-detect)
$ ev --info
Everything v1.5.0.1404
Admin: no
AppData: no
Instance: 1.5a
$ ev --instances
Running Everything instances:
1.5a class: EVERYTHING_TASKBAR_NOTIFICATION_(1.5a) ← active
Active instance: 1.5a
Selected via: auto-detect
everyfile is also a fully importable Python library — no CLI needed. The API uses DB-API 2.0 cursor/row semantics, is fully type-annotated, and has zero dependencies.
from everyfile import search, count
# Iterate results
for row in search("ext:py"):
print(row.name, row.full_path)
# Count matches without fetching
print(f"Python files: {count('ext:py')}")from everyfile import search
# Find the 10 largest log files
cursor = search(
"ext:log",
fields="size",
sort="size",
descending=True,
limit=10,
)
print(f"Showing {cursor.count} of {cursor.total} total matches")
for row in cursor:
print(f" {row.size:>12,} bytes {row.full_path}")Parameters: query, fields, sort, descending, limit, offset, match_case, match_path, match_whole_word, regex, instance.
search() returns a Cursor — a forward-only iterator with DB-API 2.0 fetch methods.
from everyfile import search
cursor = search("ext:py", limit=100)
# Metadata is available immediately (before iterating)
print(f"Total matches: {cursor.total}")
print(f"Results in cursor: {cursor.count}")
# Fetch one at a time
first = cursor.fetchone() # Row | None
# Fetch in batches
batch = cursor.fetchmany(20) # list[Row] (up to 20)
# Fetch all remaining
rest = cursor.fetchall() # list[Row]Batch processing large result sets:
cursor = search("ext:log", limit=10_000, fields="size")
while batch := cursor.fetchmany(500):
for row in batch:
process(row)Each result is a Row with typed properties and dict-style access.
from everyfile import search
for row in search("ext:py dm:today", fields="size,dates"):
# Typed properties (IDE autocomplete works)
row.name # str — always present
row.path # str — always present
row.full_path # str — always present
row.size # int | None
row.date_modified # str | None (ISO 8601)
row.date_created # str | None (ISO 8601)
row.is_file # bool | None
# Dict-style access
row["name"]
row.get("size", 0)
"size" in row # True
# Serialize to dict
row.to_dict() # {"name": ..., "path": ..., ...}For repeated queries or service introspection, create an Everything instance.
from everyfile import Everything
ev = Everything() # auto-detect running instance
# ev = Everything("1.5a") # target a specific instance
# Reuse connection for multiple queries
py_files = ev.search("ext:py", limit=5)
log_files = ev.search("ext:log", sort="size", descending=True, limit=5)
total_py = ev.count("ext:py")
# Service introspection
print(ev.version) # {"major": 1, "minor": 5, "revision": 0, ...}
print(ev.info) # indexed file/folder counts
print(ev.instance_name) # "1.5a"
# List all running instances
for inst in Everything.instances():
print(inst["name"], inst["hwnd"])from everyfile import search, EverythingError
try:
results = search("ext:py").fetchall()
except EverythingError as e:
if e.is_not_running:
print("Everything is not running")
else:
print(f"IPC error: {e}")from everyfile import search
# Field groups: "default", "all", "dates", "meta", "hl"
search("*.py", fields="all") # every available field
search("*.py", fields="meta") # size, ext, attributes, is_file, is_folder
search("*.py", fields="size,ext") # individual fields
# Sort options: name, path, size, ext, created, modified, accessed, ...
search("*.py", sort="size", descending=True)
search("*.py", sort="modified") # oldest first
search("*.py", sort="modified", descending=True) # newest firstFor the full API reference, see docs/PYTHON_API_SPEC.md.
src/everyfile/
__main__.py CLI entry point, argparse, dispatch
search.py Search orchestration, pipe filter, count, info, version
filter.py Structured NDJSON filter (ev filter)
pick.py NDJSON field extraction (ev pick)
querymatch.py Local query matching for pipe composition
sdk/
ipc.py Pure Python IPC via ctypes (WM_COPYDATA, WM_USER)
api.py High-level API wrapper, instance resolution
constants.py Everything IPC constants, request flags, sort types
types.py Field-to-flag mapping, field groups, resolution
output/
ndjson.py NDJSON serializer (stdout)
human.py Human-readable formatter (stderr)
util/
glob.py Glob matching for filter command
dates.py FILETIME ↔ ISO 8601 conversion
attrs.py FILE_ATTRIBUTE_* ↔ compact string
IPC approach: Pure Python ctypes — FindWindowW to locate Everything's hidden IPC window, SendMessageW with WM_COPYDATA for search queries, WM_USER for version/info. No DLL dependency.
everyfile uses CalVer — YYYY.M.D (no leading zeros).
| Where | Example | Notes |
|---|---|---|
| PyPI | 2026.4.18 |
pip install everyfile==2026.4.18 |
| Git tag | v2026.4.18 |
git checkout v2026.4.18 |
| ClawHub | 2026.4.18 |
openclaw skills install everyfile@2026.4.18 |
Same-day patch releases append a pre-release suffix: 2026.4.18-2, 2026.4.18-3, etc.
# 1. Bump version in pyproject.toml
# version = "2026.4.18" (or "2026.4.18-2" for same-day patches)
# 2. Commit, tag, push
git add pyproject.toml
git commit -m "release: v2026.4.18"
git tag v2026.4.18
git push && git push --tags
# 3. Publish to PyPI
python -m build && twine upload dist/*
# 4. Publish to ClawHub
clawhub publish .agents/skills/everyfile --slug everyfile --version 2026.4.18git clone https://github.com/LouisGameDev/everyfile.git
cd everyfile
pip install -e ".[dev]"
# Type check
mypy src/
# Test (requires Everything running for integration tests)
pytestMIT