Basic examples
1. List all files in current and sub directories
This command lists out all the files inthe current directory as well asthe subdirectories inthe current directory.
$ find
.
./abc.txt
./subdir
./subdir/how.php
./cool.php
The command is same asthe following
$ find .
$ find . -print
2. Search specific directory or path
The following command will look for files inthe test directory inthe current directory. Lists out all files by default.
$ find ./test
./test
./test/abc.txt
./test/subdir
./test/subdir/how.php
./test/cool.php
The following command searches for files by their name.
$ find ./test -name"abc.txt"
./test/abc.txt
We can also use wildcards
$ find ./test -name"*.php"
./test/subdir/how.php
./test/cool.php
Note that all sub directories are searched recursively. So this is a very powerful way to find all files of a given extension.
Trying to search the"/" directory which isthe root, would search the entire file system including mounted devices and network storage devices. So be careful. Of course you can press Ctrl + c anytime to stop the command.
When specifying the directory ("./test"in this example), its fine to omit the trailing slash. However, ifthe directory is actually a symlink tosome other location then you MUST specify the trailing slash foritto work properly (find ./test/ ...)
Ignore the case
It is often useful to ignore the case when searching forfile names. To ignore the case, just use the"iname" option instead ofthe"name" option.
$ find ./test -iname "*.Php"
./test/subdir/how.php
./test/cool.php
Its always better to wrap the search term (name parameter) in double or single quotes. Not doing so will seem to work sometimes and give strange results at other times.
3. Limit depth of directory traversal
The find command by default travels down the entire directory tree recursively, which istimeand resource consuming. However the depth of directory travesal can be specified. For example we don't want to go more than 2or3 levels down inthe sub directories. This is done using the maxdepth option.
$ find ./test -maxdepth 2 -name"*.php"
./test/subdir/how.php
./test/cool.php
$ find ./test -maxdepth 1 -name *.php
./test/cool.php
The second example uses maxdepth of1, which means it will not go lower than 1 level deep, either only inthe current directory.
This is very useful when we want to do a limited search only inthe current directory or max 1 level deep sub directories andnotthe entire directory tree which would take more time.
Just like maxdepth there is an option called mindepth which does what thename suggests, thatis, it will go atleast N level deep before searching forthe files.
4. Invert match
It is also possible to search for files that do no match a givennameor pattern. This is helpful when we know which files to exclude fromthe search.
$ find ./test -not -name"*.php"
./test
./test/abc.txt
./test/subdir
So intheabove example we found all files that do not have the extension of php, either non-php files. The find command also supports the exclamation mark inplace ofnot.
find ./test ! -name"*.php"5. Combine multiple search criterias
It is possible to use multiple criterias when specifying nameand inverting. For example
$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
The above find command looks for files thatbegin with abc in their names and do not have a php extension. This is an example of how powerful search expressions can be build withthe find command.
OR operator
When using multiple name criterias, the find command would combine them with AND operator, which means that only those files which satisfy all criterias will be matched. However if we need to perform an OR based matching thenthe find command has the"o" switch.
$ find -name '*.php' -o -name '*.txt'
./abc.txt
./subdir/how.php
./abc.php
./cool.php
The above command search for files ending in either the php extension orthe txt extension.
6. Search only files or only directories
Sometimes we want to find only files or only directories with a givenname. Find can do this easily as well.
$ find ./test -name abc*
./test/abc.txt
./test/abc
Only files
$ find ./test -type f -name"abc*"
./test/abc.txt
Only directories
$ find ./test -type d -name"abc*"
./test/abc
Quite useful and handy!
7. Search multiple directories together
So lets say you want to search inside 2 separate directories. Again, the command is very simple
$ find ./test ./dir2 -type f -name"abc*"
./test/abc.txt
./dir2/abcdefg.txt
Check, thatit listed files from2 separate directories.
8. Find hidden files
Hidden files on linux begin with a period. So its easy to mention thatinthename criteria andlist all hidden files.
$ find ~ -type f -name".*"
Find files based on permissions
9. Find files with certain permissions
The find command can be used to find files with a specific permission using the"perm" option. The following command searches for files withthe permission 0664
$ find . -type f -perm 0664
./abc.txt
./subdir/how.php
./abc.php
./cool.php
This can be useful to find files with wrong permissions which can lead to security issues. Inversion can also be applied to permission checking.
$ find . -type f ! -perm 0777
./abc.txt
./subdir/how.php
./abc.php
./cool.php
10. Find files with sgid/suid bits set
The "perm" option of find command accepts the same mode string like chmod. The following command finds all files with permission 644and sgid bit set.
# find / -perm 2644
Similarly use 1664for sticky bit. The perm option also supports using an alternative syntax instead of octal numbers.
$ find / -maxdepth 2 -perm /u=s 2>/dev/null
/bin/mount
/bin/su
/bin/ping6
/bin/fusermount
/bin/ping
/bin/umount
/sbin/mount.ecryptfs_private
Note thatthe"2>/dev/null" removes those entries that have an errorof"Permission Denied"11. Find readonly files
Find all Read Only files.
$ find /etc -maxdepth 1 -perm /u=r
/etc
/etc/thunderbird
/etc/brltty
/etc/dkms
/etc/phpmyadmin
... output truncated ...
12. Find executable files
The following command will find executable files
$ find /bin -maxdepth 2 -perm /a=x
/bin
/bin/preseed_command
/bin/mount
/bin/zfgrep
/bin/tempfile
... output truncated ...
Search Files Based On Owners and Groups
13. Find files belonging to particular user
To find all or single file called tecmint.txt under /root directory of owner root.
$ find . -user bob
.
./abc.txt
./abc
./subdir
./subdir/how.php
./abc.php
We could also specify thenameofthefileor any name related criteria along with user criteria
$ find . -user bob -name '*.php'
Its very easy to see, how we can build up criteria after criteria to narrow down our search for matching files.
14. Search files belonging to group
Find all files that belong to a particular group.
# find /var/www -group developer
Did you know you could search your home directory by using the ~ symbol ?
$ find ~ -name"hidden.php"
Easy!!
Search fileand directories based on modification dateandtime
Another great search criteria thatthe find command supports is modification and accessed date/times. This is very handy when we want to find out which files were modified as a certain timeordate range. Lets take a few examples
15. Find files modified N days back
To find all the files which are modified 50 days back.
# find / -mtime 5016. Find files accessed inlast N days
Find all files that were accessed inthelast50 days.
# find / -atime 5017. Find files modified in a range of days
Find all files that were modified between50to100 days ago.
# find / -mtime +50 –mtime -10018. Find files changed inlast N minutes.
Find files modified within thelast1 hour.
$ find /home/bob -cmin -6019. Files modified inlast hour
To find all the files which are modified inlast1 hour.
# find / -mmin -6020. Find Accessed Files in Last 1 Hour
To find all the files which are accessed inlast1 hour.
# find / -amin -60
Search files and directories based on size
21. Find files ofgiven size
To find all 50MB files, use.
# find / -size 50M22. Find files in a size range
To find all the files which are greater than50MB andless than100MB.
$ find / -size +50M -size -100M
23. Find largest and smallest files
The find command when used in combination withthe ls and sort command can be used tolist out the largest files.
The following command will display the5 largest fileinthe current directory andits subdirectory. This may take a whileto execute depending onthe total numberof files the command has to process.
$ find . -type f -exec ls -s {} \; | sort -n -r | head -5
Similary when sorted in ascending order, it would show the smallest files first
$ find . -type f -exec ls -s {} \; | sort -n | head -524. Find empty files and directories
The following command uses the"empty" option ofthe find command, which finds all files that are empty.
# find /tmp -type f -empty
To file all empty directories use the type "d".
$ find ~/ -type d -empty
Really very simple and easy
Some advanced operations
The find command not only finds files based on a certain criteria, it can also act upon those files using any linux command. For example, we might want to delete some files.
Here are some quick examples
25. List out the found files
Lets say we found files using find command, and now want tolist them out asthe ls command would have done. This is very easy.
$ find . -exec ls -ld {} \;
drwxrwxr-x 4 enlightened enlightened 4096 Aug 1119:01 .
-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./abc.txt
drwxrwxr-x 2 enlightened enlightened 4096 Aug 1116:48 ./abc
drwxrwxr-x 2 enlightened enlightened 4096 Aug 1116:26 ./subdir
-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:26 ./subdir/how.php
-rw-rw-r-- 1 enlightened enlightened 29 Aug 11 19:13 ./abc.php
-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./cool.php26. Delete all matching files or directories
The following command will remove all text files inthe tmp directory.
$ find /tmp -type f -name"*.txt" -exec rm -f {} \;
The same operating can be carried out with directories, just put type d, instead of type f.
Lets take another example where we want to delete files larger than 100MB
$ find /home/bob/dir -type f -name *.log -size +10M -exec rm -f {} \;