Practical Shell Examples
Practical Shell Examples
com/2009/06/15-practical-unix-linux-find-command-examples-part-2/
A while back we reviewed 15 practical find command examples (Part I). Find command can do
lot more than just searching for files based on name.
In this article (Part 2), let us discuss 15 advanced examples of find command including
finding files based on the time it is accessed, modified or changed, finding files comparatively,
performing operation on found files etc.,
Ramesh Natarajan: That is my sweet little daughter in that picture. She was very happy to spot
the sea lion in the California Long Beach Aquarium.
min argument treats its argument as minutes. For example, min 60 = 60 minutes (1
hour).
time argument treats its argument as 24 hours. For example, time 2 = 2*24 hours (2
days).
While doing the 24 hours calculation, the fractional parts are ignored so 25 hours is taken
as 24 hours, and 47 hours is also taken as 24 hours, only 48 hours is taken as 48 hours. To
get more clarity refer the -atime section of the find command man page.
Example 1: Find files whose content got updated within last 1 hour
To find the files based up on the content modification time, the option -mmin, and -mtime is
used. Following is the definition of mmin and mtime from man page.
Following example will find files in the current directory and sub-directories, whose content got
updated within last 1 hour (60 minutes)
# find . -mmin -60
In the same way, following example finds all the files (under root file system /) that got updated
within the last 24 hours (1 day).
# find / -mtime -1
Following example will find files in the current directory and sub-directories, which got accessed
within last 1 hour (60 minutes)
# find -amin -60
In the same way, following example finds all the files (under root file system /) that got accessed
within the last 24 hours (1 day).
# find / -atime -1
Following example will find files in the current directory and sub-directories, which changed
within last 1 hour (60 minutes)
In the same way, following example finds all the files (under root file system /) that got changed
within the last 24 hours (1 day).
# find / -ctime -1
Example 4: Restricting the find output only to files. (Display only files as find
command results)
The above find commands will also show the directories because directories gets accessed when
the file inside it gets accessed. But if you want only the files to be displayed then give -type f in
the find command as
The following find command displays files that are accessed in the last 30 minutes.
# find /etc/sysconfig -amin -30
.
./console
./network-scripts
./i18n
./rhn
./rhn/clientCaps.d
./networking
./networking/profiles
./networking/profiles/default
./networking/profiles/default/resolv.conf
./networking/profiles/default/hosts
./networking/devices
./apm-scripts
[Note: The above output contains both files and directories]
# find /etc/sysconfig -amin -30 -type f
./i18n
./networking/profiles/default/resolv.conf
./networking/profiles/default/hosts
[Note: The above output contains only files]
Example 5: Restricting the search only to unhidden files. (Do not display hidden
files in find output)
When we dont want the hidden files to be listed in the find output, we can use the following
regex.
The below find displays the files which are modified in the last 15 minutes. And it lists only the
unhidden files. i.e hidden files that starts with a . (period) are not displayed in the find output.
# find . -mmin -15 \( ! -regex ".*/\..*" \)
Human mind can remember things better by reference such as, i want to find files which i edited
after editing the file test. You can find files by referring to the other files modification as like
the following.
Example 6: Find files which are modified after modification of a particular FILE
Syntax: find -newer FILE
Following example displays all the files which are modified after the /etc/passwd files was
modified. This is helpful, if you want to track all the activities youve done after adding a new
user.
# find -newer /etc/passwd
Example 7: Find files which are accessed after modification of a specific FILE
Syntax: find -anewer FILE
Following example displays all the files which are accessed after modifying /etc/hosts. If you
remember adding an entry to the /etc/hosts and would like to see all the files that youve
accessed since then, use the following command.
# find -anewer /etc/hosts
Example 8: Find files whose status got changed after the modification of a
specific FILE.
Syntax: find -cnewer FILE
Following example displays all the files whose status got changed after modifying the /etc/fstab.
If you remember adding a mount point in the /etc/fstab and would like to know all the files who
status got changed since then, use the following command.
find -cnewer /etc/fstab
We can specify any operation on the files found from find command.
find <CONDITION to Find files> -exec <OPERATION> \;
wc command to count the total number of words on find command output files.
or Execute your own custom shell script / command on find command output files.
Example 9: ls -l in find command output. Long list the files which are edited
within the last 1 hour.
# find -mmin -60
./cron
./secure
# find -mmin -60 -exec ls -l {} \;
-rw------- 1 root root 1028 Jun 21 15:01 ./cron
-rw------- 1 root root 831752 Jun 21 15:42 ./secure
This will search for the file only in the current file system. Following is the xdev definition from
find man page:
Following command will search for *.log files starting from / (root) and only in the current file
system. i.e If you have multiple partitions mounted under / (root), the following command will
NOT search all those mounted partitions.
# find / -xdev -name "*.log"
Using this {} in the same command is possible but using it in different command it is not
possible, say you want to rename the files as following, which will not give the expected result.
find -name "*.txt" -exec mv {} `basename {} .htm`.html \;
These double quotes are to handle spaces in file name. And then call that shell script from the
find command as shown below.
find -name "*.html" -exec ./mv.sh '{}' \;
So for any reason if you want the same file name to be used more than once then writing the
simple shell script and passing the file names as argument is the simplest way to do it.
Sometimes this may be helpful. For example, if you are trying to find all the *.conf file under /
(root) from your account, you may get lot of Permission denied error message as shown below.
$ find / -name "*.conf"
/sbin/generate-modprobe.conf
find: /tmp/orbit-root: Permission denied
find: /tmp/ssh-gccBMp5019: Permission denied
find: /tmp/keyring-5iqiGo: Permission denied
find: /var/log/httpd: Permission denied
find: /var/log/ppp: Permission denied
/boot/grub/grub.conf
find: /var/log/audit: Permission denied
find: /var/log/squid: Permission denied
find: /var/log/samba: Permission denied
find: /var/cache/alchemist/printconf.rpm/wm: Permission denied
[Note: There are two valid *.conf files burned in the "Permission denied"
messages]
So, if you want to just view the real output of the find command and not the Permission
denied error message you can redirect the error message to /dev/null as shown below.
$ find / -name "*.conf" 2>>/dev/null
/sbin/generate-modprobe.conf
/boot/grub/grub.conf
[Note: All the "Permission denied" messages are not displayed]