Need help with friendly-find?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

209 Stars 19 Forks GNU General Public License v3.0 53 Commits 1 Opened issues


A friendlier find(1).

Services available


Need anything else?

Contributors list

# 61,769
Common ...
42 commits
# 81,785
3 commits
# 1,885
1 commit
# 568,081
1 commit
# 681,023
1 commit


is the friendly file finder.

It's meant to be a more usable replacement for find(1). If you've used ack, then ffind is to find as ack is to grep.

Currently it's still in a prototype stage. Most things work, with the following notable exceptions:

  • Time filtering is unimplemented.
  • SVN ignores aren't parsed.
  • It's pretty slow (though pruning VCS data directories saves lots of time).

Feedback is welcome, though remember that it's still a prototype, and is opinionated software.


If you're on OS X you can use Homebrew:

brew install ffind

Or you can install manually:

  1. Copy the
    to your computer somehow.
  2. Make it executable.
  3. Get it into your path somehow.


There's a half-assed man page generated from

, but
ffind --help
is probably easier to read.

Command Line Program

Usage: ffind [options] PATTERN

Options: -h, --help show this help message and exit --version print the version and exit -d DIR, --dir=DIR root the search in DIR (default .) -D N, --depth=N search at most N directories deep (default 25) -f, --follow follow symlinked directories and search their contents -F, --no-follow don't follow symlinked directories (default) -0, --print0 separate matches with a null byte in output -l, --literal force literal search, even if it looks like a regex -v, --invert invert match -e, --entire match PATTERN against the entire path string -E, --non-entire match PATTERN against only the filenames (default) -p, --full-path print the file's full path -P, --relative-path print the file's relative path (default)

Configuring Case Sensitivity: -s, --case-sensitive case sensitive matching (default) -i, --case-insensitive case insensitive matching -S, --case-smart smart case matching (sensitive if any uppercase chars are in the pattern, insensitive otherwise)

Configuring Ignoring: -b, --binary allow binary files (default) -B, --no-binary ignore binary files -r, --restricted restricted search (skip VCS directories, parse all ignore files) (default) -q, --semi-restricted semi-restricted search (don't parse VCS ignore files, but still skip VCS directories and parse .ffignore) -u, --unrestricted unrestricted search (don't parse ignore files, but still skip VCS directories) -a, --all don't ignore anything (ALL files can match) -I PATTERN, --ignore=PATTERN add a pattern to be ignored (can be given multiple times)

Size Filtering: Sizes can be given as a number followed by a prefix. Some examples: 1k, 5kb, 1.5gb, 2g, 1024b

--larger-than=SIZE  match files larger than SIZE (inclusive)
                    match files smaller than SIZE (inclusive)

Type Filtering: Possible types are a (all), f (files), d (dirs), r (real), s (symlinked), e (real files), c (real dirs), x (symlinked files), y (symlinked dirs). If multiple types are given they will be unioned together: --type 'es' would match real files and all symlinks.

-t TYPE(S), --type=TYPE(S)
                    match only specific types of things (files, dirs, non-
                    symlinks, symlinks)

.ffignore file format


file is a file containing lines with patterns to ignore, with a few exceptions:
  • Blank lines and whitespace-only are skipped. If you want to ignore files whose names consist of only whitespace use a regex. Or reconsider what got you there in the first place.
  • Lines beginning with a
    are comments and are skipped. There can be whitespace before the
    as well.
  • Lines of the form
    syntax: (literal|regex)
    change the mode of the lines following them, much like Mercurial's ignore file format. The default is regex mode.
  • All other lines are treated as patterns to ignore.

All patterns are unrooted, and search the full path from the directory you're searching in. Use a regex with

if you want to root them.

For example:


Will ignore:



Copyright 2016 Steve Losh and contributors.

Licensed under version 3 of the GPL.

Remember that you can use GPL'ed software through their command line interfaces without any license-related restrictions.

's command line interface is the only stable one, so it's the only one you should ever be using anyway. The license doesn't affect you unless you're:
  • Trying to copy the code and release a non-GPL'ed version of
  • Trying to use it as a Python module from other Python code (for your own sanity I urge you to not do this) and release the result under a non-GPL license.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.