Actually, there are two commands,find and locate, which help us find files that meet to a specific pattern. But,it’s important for us to keep in mind that there are several differences between find and locate which make them have different strengths in different aspects.
The find searches recursively in real time, is slower but always up-to-date and provides more options (-name, -type, -size, …) than locate.
The locate searches by using a previously built database which is automatically updated on a nightly basis. To update the database manually, change to a root user andtype the command updatedb, which would take a great amount of time according to the size of the system. Thus, it locates files much faster than find, but using an ‘older’ database may cause user failure to locate files which could be removed or not updated into the database.
# locate passwd
Since locate doesn’t search in real time and is rarely used in reality, this essay would mainly focus on the find command and only the options frequently used will be covered.
The format of the find command is:
# find [path] [pattern] [action]
Path: Specify the working directory whose default working directory is the current one the find command starts in.
Pattern: Specify the search criterion. Without specification, it will recursively return all files under the working directory by default.
Action: Specify the action that will perform on the files found.
1. Standard Pattern
-name ‘FILENAME’: Match the files whose name is exactly the same as the FILENAME which can include the metacharacters (‘*’, ‘?’, ‘[]’) which make it more flexible.
# find /etc -name 'passwd*'
-iname ‘FILENAME’: Like –name, but the match is case insensitive.
-regex PATTERN: File name matches regular expression pattern.
-user USERNAME: Search by user uname.
# find /tmp -user user1
-group GROUPNAME: Search by group gname.
-uid UID: Search by numeric user ID.
# find /tmp -uid 2003
-gid GID: Search by numeric group ID.
-nouser: Files that no user corresponds to will be returned.
-nogroup: Files that no group corresponds to will be returned.
-type [f|d|b|c|l|p|s]: Search by the type of files.
f regular file
d directory
b block special
c character special
l symbolic link
p named pipe
s socket
# find /tmp -type f
-size [+|-]#[kMG]: Search by the size of files. The defaultsize unit is byte.
+ greater than the specified criteria of size.
- less than the specifiedcriteria of size.
k for kilobytes
M for megabytes
G for gigabytes
# find /etc -size -1M
-[mtime|ctime|atime][+|-]#: The default time unit is day.
mtime file’s data was last modified #*24 hours ago.
ctime file’s status was last changed #*24hours ago.
atime file was last accessed #*24 hours ago.
# find /tmp -atime +30
-[mmin|cmin|amin][+|-]#: The default time unit is minute.
mmin file’s data was last modified #minutes ago.
cmin file’s status was last changed # minutes ago.
amin file was last accessed # minutes ago.
# find /tmp -amin -5
-perm MODE: File’s permission bits are exactly the same as MODE (octal or symbolic).
# find . -perm 644
-MODE: All of the permission bits MODE are set for the file.
# find . -perm -664
/MODE: Any of the permission bits MODE are set for the file.
# find . -perm /222
2. Logical operation
-a: and
# find /tmp -nouser -a -type d -ls
-o: or
# find ./ -not \(-user user1 -o -user user2 \)
-not: not
# find /tmp -not -type d
3. Action
-print: print the full file name on the standard output.
-ls: list current file in ls –dils format on standard output.
-exec COMMAND {} \;: execute COMMAND. {} represents the current file name.
# find ./ -perm -006 -exec chmod 0-w {} \;
-ok COMMAND {} \;: like –exec but ask the user first.
# find ./ -type d -ok chmod +x {} \;
Reference:
[1] Man7.org, (2015). find(1) - Linux manual page. [online] Available at: http://man7.org/linux/man-pages/man1/find.1.html [Accessed 14 Oct. 2015].