Pseek
Fast and powerful command-line search tool for finding files, directories, and text content.
Features
- Search file names
- Search directory names
- Search file contents
- Search inside archive files
- Boolean query expressions (
and,or,not) - Regular expressions
- Fuzzy matching
- Whole-word matching
- Case-sensitive search
- Archive recursion depth control
- Extension filters
- Path filters
- Size filtering
- Full path output
- Highlight matches in output
- Cross-platform (Linux, macOS, Windows)
Installation
Install from PyPI (Recommended)
pip install pseek
Install from Source
git clone https://github.com/grootle/pseek.git
cd pseek
python -m venv venv
# Activate virtual environment
pip install .
Basic Usage
psk <query> <path> [options]
Example:
psk error
If no search type is specified, Pseek searches:
- File names
- Directory names
- File contents
simultaneously.
To search for a query that starts with -, use -- to mark the end of options:
psk -- --path
Command Options
| Option | Description |
|---|---|
--file |
Search only in file names |
--directory |
Search only in directory names |
--content |
Search within file contents |
--ext, --exclude-ext |
Filter by file extension (e.g., txt, log) |
--case-sensitive |
Make the search case-sensitive (except when --expr is enabled, in which case you can make it case sensitive by putting c before term: c"foo") |
--regex |
Use regular expressions to search (except when --expr is enabled, in which case you can make it regex by putting r before term: r"foo") |
--include, --exclude |
Limit search results to specific set of directories or files |
--re-include, --re-exclude |
Limit search results to specific directories or files with regex |
--word |
Match the whole word only (except when --expr is enabled, in which case you can make it match whole word by putting w before term: w"foo") |
--expr |
Enable boolean query expressions. Example: r"foo.*bar" and ("bar" or "baz") and not "qux". Prefixes: r=regex, c=case-sensitive, w=whole-word, f=fuzzy |
--timeout |
Stop the search after the specified number of seconds |
--fuzzy |
Enable fuzzy search (Highlighting and counting matches are disabled in this mode if --word is not enabled to prevent the program from slowing down). except when --expr is enabled, in which case you can make it fuzzy by putting f before term: f"foo" |
--fuzzy-level |
Fuzzy matching threshold (0-99). Higher values require closer matches (default: 80) |
--size |
Limit results based on the size of files |
--archive |
Enable search within archive files (e.g. zip, rar, 7z, gz, bz2, xz, tar, tar.gz, tar.bz2, tar.xz) |
--depth |
Maximum nested archive depth. Example: 2 allows searching up to two archive levels |
--arc-ext, --arc-exc-ext |
Filter by file extension inside archive files |
--arc-include, --arc-exclude |
Limit search results to specific set of directories or files inside archive files |
--arc-size |
Limit results based on the size of files in the archive |
--rar-backend |
Path to RAR backend tool (e.g. UnRAR.exe, ...) |
--absolute-path |
Display full path of files and directories |
--paths-only |
Only show matching file paths for content search |
--stats |
Show search statistics including result counts and search time |
Specifying the root directory
To search a specific directory, path can be given as a second argument:
psk error /log
Search Types
Search File Names
psk config --file
Search Directory Names
psk backup --directory
Search File Contents
psk TODO --content
Search Everywhere
psk error
Equivalent to:
psk error --file --directory --content
Query Modes
By default, the query is treated as plain text.
Example:
psk "hello world"
Note: To use case-sensitive, whole-word matching, regular expression search, and fuzzy search when --expr is enabled, we can use expression prefixes.
Case Sensitive Search
psk Hello --case-sensitive
Matches: Hello
Does not match: hello, HELLO
Whole Word Search
psk cat --word
Matches: cat
Does not match: cats, concatenate
Regular Expression Search
Enable regex mode:
psk error\d+ --regex
Example matches: error1, error25, error999
Fuzzy Search
Fuzzy search allows approximate matching.
Example:
psk apple --fuzzy
Can match: appl, appel, aple
Fuzzy Similarity Threshold
psk apple --fuzzy --fuzzy-level 90
Range: 1-99
Higher values require closer matches.
Examples:
| Level | Strictness |
|---|---|
| 60 | Loose |
| 80 | Recommended |
| 95 | Very strict |
Default: 80
Expression Queries
Expression mode enables logical search expressions.
Enable:
psk '("error" or "warning") and not "debug"' --expr
Supported Operators
AND
psk '"foo" and "bar"' --expr
Both terms must match.
OR
psk '"foo" or "bar"' --expr
At least one term must match.
NOT
psk 'not "foo"' --expr
Exclude matches containing the term.
PARENTHESES
psk '("foo" or "bar") and not "baz"' --expr
Used for grouping expressions.
Expression Prefixes
Each term can have its own search mode.
Regex
r"pattern"
Example:
psk 'r"error\d+"' --expr
Case Sensitive
c"text"
Example:
psk 'c"Error"' --expr
Whole Word
w"text"
Example:
psk 'w"cat"' --expr
Fuzzy
f"text"
Example:
psk 'f"apple"' --expr
Combined Prefixes
Prefixes can be combined.
Examples:
rc"text"
cw"text"
cf"text"
wcf"text"
Example:
psk 'rc"Error\d+"' --expr
Meaning:
- regex
- case-sensitive
simultaneously.
Allowed modes: r, c, w, f, rc, cr, cw, wc, cf, fc, wf, fw, cwf, cfw, wcf, wfc, fcw, fwc
Note: Whole word matching and regex matching cannot be used at the same time, because we can use \b in regex to enable whole word matching: r"\btext\b"
Extension Filters
Include only specific extensions:
psk TODO --ext py --ext js
Exclude extensions:
psk TODO --exclude-ext exe --exclude-ext dll
Path Filters
Include Paths
psk TODO \
--include src \
--include tests
Only search inside those paths.
Exclude Paths
psk TODO \
--exclude build \
--exclude .git
Skip those paths.
Note: The include and exclude paths will be combined with path argument.
Regex Path Filters
Include
psk TODO \
--re-include src/.*
Exclude
psk TODO \
--re-exclude "node_modules|dist"
Size Filtering
| Syntax | Meaning |
|---|---|
10m |
exactly 10 MiB |
:10m |
10 MiB or smaller |
10m: |
10 MiB or larger |
10m:20m |
between 10 MiB and 20 MiB |
Both range boundaries are included.
Sizes can be specified using the following units:
| Suffix | Unit |
|---|---|
b |
Bytes |
k |
KiB (1024 bytes) |
m |
MiB (1024^2 bytes) |
g |
GiB (1024^3 bytes) |
t |
TiB (1024^4 bytes) |
Unit suffixes are case-insensitive, so these are equivalent: 10m, 10M
The --size option can be used multiple times. Each size filter is treated as an alternative, meaning that a file only needs to match one of the specified ranges.
For example:
psk config \
--size :1m \
--size 10m:
Files between 1 MiB and 10 MiB will not match.
Note: Directory sizes are not calculated recursively. When --size is used, directories are automatically excluded from the search results.
Archive Search
Enable archive support:
psk TODO --archive
Supported formats: zip, rar, 7z, gz, bz2, xz, tar, tar.gz, tar.bz2, tar.xz
Nested Archives
Pseek supports nested archives for multi-file archive containers (zip, rar, 7z, tar and compressed tar formats). Nested archive traversal means Pseek can search inside an archive that itself contains other archives (for example a.zip containing b.7z containing c.tar.gz).
Example:
backup.zip
└── source.7z
└── notes.txt
Pseek can search:
backup.zip::source.7z::notes.txt
Archive Depth
Limit recursion depth:
psk TODO --archive --depth 2
Meaning archive level 1 and archive level 2 will be searched. Deeper levels will be skipped.
Note: --depth 0 means perform the search only within this current archive and don't enter nested archives.
Archive Filters
Extension Filters
psk TODO --archive --arc-ext py
Only search .py files inside archives.
psk TODO --archive --arc-exc-ext jpg
Exclude .jpg files inside archives.
Path Filters
Include:
psk TODO --archive --arc-include src
Exclude:
psk TODO --archive --arc-exclude cache
Size Filter
This works exactly like the --size option.
psk TODO --archive --arc-size 10m:40m
Note: Archive directory sizes are usually reported as zero by archive formats, so directory search is disabled if this filter is enabled to avoid incorrect results.
RAR Backend
RAR archives require an external helper programs. To enable full support for RAR, either install one of the helper programs in your PATH or provide a backend configuration to Pseek.
Supported backends include:
- UnRAR
- 7-Zip
- BSDTar
- Unar
If one of these is installed and available in PATH, Pseek will detect it automatically when --archive is used and enable archive traversal for RAR files. If not detected, Pseek prints a warning and archive support for that format is disabled.
Use the --rar-backend option to persistently configure a backend and its path.
Examples:
- Linux:
psk unrar --rar-backend /usr/bin/unrar - Windows:
psk unrar --rar-backend "C:\Program Files\WinRAR\UnRAR.exe"
Enter the file type in the query (e.g. unrar, bsdtar, unar, 7z).
Output Options
Show Full Paths
psk TODO --absolute-path
Paths Only
Only display matching file paths:
psk TODO --content --paths-only
Useful for very large result sets.
Timeout
Stop the search automatically after a specified number of seconds.
Example:
psk TODO --timeout 0.5
If the search exceeds the limit, it will be terminated. Results found before the search is terminated are still displayed.
Search Statistics
Display a summary of the search, including result counts, scanned paths, archive information, and search time.
pseek config --stats
Example output:
Statistics
────────────────
Results
Files: 12
Directories matched: 3
Files with matched content: 8
Lines matched: 24
Matches: 31
Search
Files scanned: 1,248
Archives scanned: 5
Directories scanned: 96
Search time: 0.128s
Result statistics
- Files matched — Number of files whose names matched the query.
- Directories matched — Number of directories whose names matched the query.
- Files with matched content — Number of files containing at least one content match.
- Lines matched — Number of lines containing one or more matches.
- Matches — Total number of matches found in the contents of the files.
Search statistics
- Files scanned — Number of files examined during the search.
- Archives scanned — Number of archives processed, including nested archives found inside other archives.
- Directories scanned — Number of directories reached and examined during traversal.
When --archive is enabled, file and directory statistics can also include paths inside archives, not just physical paths on the filesystem.
Directories scanned can be 0 when the search path contains no subdirectories. The root search directory itself isn't counted as a scanned directory.
Search time
Time spent performing the search.
When --timeout is used, the statistics represent the work completed before the timeout.
Requirements
- Python
3.10+ unrar,bsdtar,unaror7zipfor the rarfile library to support searching inside.rarfiles (optional)
Release files for pseek 3.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pseek-3.1.2.tar.gz | 26.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pseek-3.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.6 kB
Release files / pseek-3.1.2.tar.gz
| Download URL | pseek-3.1.2.tar.gz |
|---|---|
| Size | 26.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e6b34ec814e66c799571d06ee0d51cadc525a2c67f57667c6903185cf6750c6a
|
|
BLAKE2b-256 checksum How to use checksums |
f860fc7172f787c2a726761b4657dd1bf57c48de613a34035aaf86d7b20ad2b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pseek-3.1.2-py3-none-any.whl
| Download URL | pseek-3.1.2-py3-none-any.whl |
|---|---|
| Size | 24.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e621477d4c08b5ba697490661eb39b52b2f96c7199aaafa82ed94bac58e91ca6
|
|
BLAKE2b-256 checksum How to use checksums |
33a39c959031a7f02d3357fd9a01402c762f18beb5f40fe3980193bc68ea94b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|