Linux Find Command
Basic examples
1. List all files in current and sub directories
1 | $ find |
The command is same as the following1
2$ find .
$ find . -print
2. Search specific directory or path
The following command searches for files by their name.
1 | $ find ./test -name "abc.txt" |
We can also use wildcards1
2
3$ find ./test -name "*.php"
./test/subdir/how.php
./test/cool.php
It is often useful to ignore the case when searching for file names. To ignore the case, just use the “iname” option instead of the “name” option.1
2
3$ find ./test -iname "*.Php"
./test/subdir/how.php
./test/cool.php
3. Limit depth of directory traversal
1 | $ find ./test -maxdepth 2 -name "*.php" |
Just like maxdepth there is an option called mindepth which does what the name suggests, that is, it will go atleast N level deep before searching for the files.
4. Invert match
It is also possible to search for files that do not match a given name or pattern. This is helpful when we know which files to exclude from the search.1
2
3
4$ find ./test -not -name "*.php"
./test
./test/abc.txt
./test/subdir
So in the above 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 of not.1
find ./test ! -name "*.php"
5. Combine multiple search criterias
It is possible to use multiple criterias when specifying name and inverting. For example1
2
3$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
The above find command looks for files that begin with abc in their names and do not have a php extension. This is an example of how powerful search expressions can be build with the 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 then the find command has the “o” switch.1
2
3
4
5$ 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 or the txt extension.
6. Search only files or only directories
Sometimes we want to find only files or only directories with a given name. Find can do this easily as well.1
2
3$ find ./test -name "abc*"
./test/abc.txt
./test/abc
Only files1
2$ find ./test -type f -name "abc*"
./test/abc.txt
Only directories1
2$ find ./test -type d -name "abc*"
./test/abc
7. Search multiple directories together
So lets say you want to search inside 2 separate directories. Again, the command is very simple1
2
3$ find ./test ./dir2 -type f -name "abc*"
./test/abc.txt
./dir2/abcdefg.txt
Check, that it listed files from 2 separate directories.
8. Find hidden files
Hidden files on linux begin with a period. So its easy to mention that in the name criteria and list all hidden files.1
$ 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 with the permission 06641
2
3
4
5$ 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.1
2
3
4
5$ 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 644 and sgid bit set.1
# find / -perm 2644
11. Find readonly files
Find all Read Only files.1
2
3
4
5
6$ find /etc -maxdepth 1 -perm /u=r
/etc
/etc/thunderbird
/etc/brltty
/etc/dkms
/etc/phpmyadmin
12. Find executable files
The following command will find executable files1
2
3
4
5
6$ find /bin -maxdepth 2 -perm /a=x
/bin
/bin/preseed_command
/bin/mount
/bin/zfgrep
/bin/tempfile
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.1
2
3
4
5
6
7$ find . -user bob
.
./abc.txt
./abc
./subdir
./subdir/how.php
./abc.php
We could also specify the name of the file or any name related criteria along with user criteria
1 | $ 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.1
# find /var/www -group developer
Did you know you could search your home directory by using the ~ symbol ?1
$ find ~ -name "hidden.php"
15. Find files modified N days back
To find all the files which are modified 50 days back.1
# find / -mtime 50
16. Find files accessed in last N days
Find all files that were accessed in the last 50 days.1
# find / -atime 50
17. Find files modified in a range of days
Find all files that were modified between 50 to 100 days ago.1
# find / -mtime +50 –mtime -100
18. Find files changed in last N minutes.
Find files modified within the last 1 hour.1
$ find /home/bob -cmin -60
19. Files modified in last hour
To find all the files which are modified in last 1 hour.1
$ find / -mmin -60
20. Find Accessed Files in Last 1 Hour
To find all the files which are accessed in last 1 hour.1
# find / -amin -60
Search files and directories based on size
21. Find files of given size
To find all 50MB files, use.1
# find / -size 50M
22. Find files in a size range
To find all the files which are greater than 50MB and less than 100MB.1
$ find / -size +50M -size -100M
23. Find largest and smallest files
The find command when used in combination with the ls and sort command can be used to list out the largest files.
The following command will display the 5 largest file in the current directory and its subdirectory. This may take a while to execute depending on the total number of files the command has to process.1
$ find . -type f -exec ls -s {} \; | sort -n -r | head -5
Similary when sorted in ascending order, it would show the smallest files first1
$ find . -type f -exec ls -s {} \; | sort -n | head -5
24. Find empty files and directories
The following command uses the “empty” option of the find command, which finds all files that are empty.1
$ find /tmp -type f -empty
To file all empty directories use the type “d”.1
$ find ~/ -type d -empty
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 to list them out as the ls command would have done. This is very easy.1
2
3
4
5
6
7
8$ find . -exec ls -ld {} \;
drwxrwxr-x 4 enlightened enlightened 4096 Aug 11 19:01 .
-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./abc.txt
drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:48 ./abc
drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16: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.php
26. Delete all matching files or directories
The following command will remove all text files in the tmp directory.1
$ 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 100MB1
$ find /home/bob/dir -type f -name *.log -size +10M -exec rm -f {} \;
27. find all files excliude folder
The following command will find all files excliude venv folder1
2$ find . | grep -v venv
$ find . | grep -v venv | grep -v pycache
Summary
So that was a quick tutorial on the linux find command. The find command is one of the most essential commands on the linux terminal, that enables searching of files very easy. Its a must of all system administrators. So learn it up. Have any questions ? Leave a comment below.