find¶
The find util letes you search a filesystem for things that match filesystem attributes. Unfortunately this is one of those tools where BSD and GNU deviate syntactically and featurewise, and GNU mostly wins.
Examples¶
Find and delete empty directories 2 levels deep or deeper¶
find "${PWD}" -mindepth 2 -type d -empty -delete
Find based on a regex¶
find /tank/movies -regextype egrep -iregex '.*\.(mov|mp4)$'
Find files and perform operations on them¶
One at a time:
find "${PWD}" -type d -exec dot_clean {} \;
Or several in batches, similar to how xargs handles things:
find "${PWD}" -type d -exec dot_clean {} \+
Find files that match a glob¶
find "${PWD}" -name '????????-??-??-??_[0-9][0-9][0-9]???.dng'
Alter permissions on some files that are not already set correctly¶
find . -mindepth 2 -type f ! -perm 444 -exec chmod 444 {} \+
Find files in the current directory that do not match any of several listed filenames¶
find . -maxdepth 1 -type f ! -iname '.*' ! -name .DS_Store ! -name '*.db'
Correctly handle spaces when piping to xargs¶
find /Applications -mindepth 1 -maxdepth 1 -type d -name '* *' -print0 | xargs -0 -n1 echo
Find executable files¶
This finds all files where an executable bit is set.
With BSD find:
find . -type f -perm +111
With GNU find:
find . -type f -executable
See also¶
- https://github.com/jhspetersson/fselect: Find files with SQL-like queries
- https://github.com/junegunn/fzf: fzf is a general-purpose command-line fuzzy finder