ctime, mtime and atime are very useful commands when dealing with time related search commands in the linux Family of operating systems.
This post is about how to use them in
a simple but yet very powerful way. Let’s get to it:
Let say you want to find all files in a folder that follow/fulfill the following criteria:
- the folder is /vat/lib/mysql/data
- The file name contains: mysql-bin.
- The files are younger than 2 days.
In other words find all the mysql binary log files that are not older than 2 days. I am using mysql binary logs of a server as an example here, but the same might apply to any type of files and folders.
ctime; Here is the command :
$ find /var/lib/mysql/data -ctime -2 -name 'mysql-bin.*' /var/lib/mysql/data/mysql-bin.007989 /var/lib/mysql/data/mysql-bin.007988 /var/lib/mysql/data/mysql-bin.007990 /var/lib/mysql/data/mysql-bin.007994 (...) $
if you see the output it magically shows the files wanted. Isn’t that great? Not let’s break it in smaller pieces.
- find is the command that says you will try to find something to the OS.
- then next the path where you want to find stuff.
- Then -ctime -2, this means creation time is younger than 2, here you can also say different stuff:
- For instance any integer positive number you add here will be the MAX age of the files to find. technically 2 means 3 days, but aside from that is regular find younger than x days.
According to the docs: -mtime n File's data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times. -atime n File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.
- Then the last part is just to find by name. -name ‘mysql-bin.*’ any file or directory who’s name starts with mysql-bin., * means wildcard or anything.
- For instance any integer positive number you add here will be the MAX age of the files to find. technically 2 means 3 days, but aside from that is regular find younger than x days.
Ok so we got a command now you should know the main parameters and be able to find help if needed:
- ctime is creation time in days.
- mtime is modification time in days.
- atime is access time in days.
- cmin same as -ctime, but in minutes
- mmin same as -mtime but in minutes
- amin same as -atime but in days.
Find has many other parameters that help you filter by other many parameters, you can just execute man and check them out or make s simple search in google. Another thing you need to keep present is the sign of the integer number, e.g.:
- mtime -3 means younger than 3+1 days.
- atime 5 means exactly between 5 and 6 days.
- ctime +4 means older than 4+1 days.
- Then you can combine statements like ‘-ctime +2 -ctime -4’ which means between those two numbers (remember the +1 so it would be between 3 and 5).
And with this you can create fun and useful commands that will ease your serch. e.g.:
Remove everything older than one month in the path recoursively:
find ~/abelworld/files -ctime +30 -exec rm -rf '{}' ';'
Find everything create in the folder between 1 and 3 months and the name ends in .txt:
find ~/abelworld/files -mtime +30 -mtime -60 -name '*.txt'
And that is all for today. I hope you found it usefull and feel free to comment on any other cool usage for the find command.