Home

Awesome

zfind

zfind allows you to search for files, including inside tar, zip, 7z and rar archives. It makes finding files easy with a filter syntax that is similar to an SQL-WHERE clause. This means, if you know SQL, you don't have to learn or remember any new syntax just for this tool.

Basic Usage & Examples

zfind <where> [<path>...]

Examples

# find files smaller than 10KB, in the current path
zfind 'size<10k'

# find files in the given range in /some/path
zfind 'size between 1M and 1G' /some/path

# find files modified before 2010 inside a tar
zfind 'date<"2010" and archive="tar"'

# find files named foo* and modified today
zfind 'name like "foo%" and date=today'

# find files that contain two dashes using a regex
zfind 'name rlike "(.*-){2}"'

# find files that have the extension .jpg or .jpeg
zfind 'ext in ("jpg","jpeg")'

# find directories named foo and bar
zfind 'name in ("foo", "bar") and type="dir"'

# search for all README.md files and show in long listing format
zfind 'name="README.md"' -l

# show results in csv format
zfind --csv
zfind --csv-no-head

Where Syntax

Example: '(size > 20M OR name = "temp") AND type="file"' selects all files that are either greater than 20 MB in size or are named temp.

Example: 'date > "2020-10-01"' selects all files that were modified after the specified date.

Example: '"name like "z%"' selects all files whose name starts with 'z'.

Example: '"type in ("file", "link")' selects all files of type file or link.

Example: '"date between "2010" and "2011-01-15"' means that all files that were modified from 2010 to 2011-01-15 will be included.

Example: '"name not like "z%"', '"date not between "2010" and "2011-01-15"', '"type not in ("file", "link")'

Properties

The following file properties are available:

namedescription
namename of the file
pathfull path of the file
containerpath of the container (if inside an archive)
sizefile size (uncompressed)
datemodified date in YYYY-MM-DD format
timemodified time in HH-MM-SS format
extshort file extension (e.g., txt)
ext2long file extension (two parts, e.g., tar.gz)
typefile, dir, or link
archivearchive type: tar, zip, 7z, rar or empty

Helper properties

namedescription
todaytoday's date
molast monday's date
tulast tuesday's date
welast wednesday's date
thlast thursday's date
frlast friday's date
salast saturday's date
sulast sunday's date

Supported archives

nameextensions
tar.tar, .tar.gz, .tgz, .tar.bz2, .tbz2, .tar.xz, .txz
zip.zip
7zip.7z
rar.rar

Note: use the flag -n (or --no-archive) to disable archive support. You can also use 'not archive' in your query but this still requires zfind to open the archive.

Actions

zfind does not implement actions like find, instead use xargs -0 to execute commands:

zfind --no-archive 'name like "%.txt"' -0 | xargs -0 -L1 echo

zfind can also produce --csv (or --csv-no-head) that can be piped to other commands.

Configuration

Set the environment variable NO_COLOR to disable color output.

Installation

Binary releases

You can download the official zfind binaries from the releases page and place it in your PATH.

Prereleased versions can be found directly on the GitHub Action. Click on the latest ci action and look for prerelease-artifacts at the bottom.

Homebrew (macOS and Linux)

For macOS and Linux it can also be installed via Homebrew:

brew install zfind

Arch Linux

zfind is available in the AUR as zfind:

paru -S zfind

Build from Source

Building from the source requires Go.

go install github.com/laktak/zfind/cmd/zfind@latest
git clone https://github.com/laktak/zfind
zfind/scripts/build
# output is here:
zfind/zfind

zfind as a Go module

zfind is can also be used in other Go programs.

go get github.com/laktak/zfind

The library consists of two main packages:

For more information see the linked documentation on pkg.go.dev.