1. Introduction
In this tutorial, we’ll learn three different ways to copy Linux files based on their modification date.
Let’s start with some directories and files:
$ ls -lR
.:
total 92
drwxr-xr-x. 2 root root 21 Jan 2 07:44 dir1
drwxr-xr-x. 2 root root 21 Jan 3 07:44 dir2
drwxr-xr-x. 2 root root 21 Jan 4 07:43 dir3
-rw-r--r--. 1 root root 56559 Dec 30 11:04 file1
-rw-r--r--. 1 root root 11379 Jan 1 11:05 file2
-rw-r--r--. 1 root root 21793 Jan 2 07:44 file3
./dir1:
total 0
-rw-r--r--. 1 root root 0 Jan 4 07:42 inside1
./dir2:
total 0
-rw-r--r--. 1 root root 0 Jan 4 07:43 inside2
./dir3:
total 0
-rw-r--r--. 1 root root 0 Jan 4 07:43 inside3
We have three directories and three files here. All directories have their own files (inside1, inside2, inside3)
2. Using find
We want to use the find command to copy all the files that have changed in the last three days to a specific path /root/desFolder. So first, we need to take a quick look at the output of find:
$ find . -type f
./file1
./file2
./file3
./dir1/inside1
./dir2/inside2
./dir3/inside3
Here the ‘.’ refers to the current directory. We can see that all folders are also considered. Therefore we should limit the result to consider only files by using -type.
We can easily specify files that are modified from 3 days ago by using -mtime:
$ find . -type f -mtime -3
./file2
./file3
./dir1/inside1
./dir2/inside2
./dir3/inside3
Eventually, if the result is what we expected, we use the cp command to copy the files to the destination:
$ find . -type f -mtime -3 -exec cp {} /root/desFolder \;
We should close -exec by using ‘*\;*‘ at the end. Moreover, we need to pay attention to a significant point. All files will be copied into one folder, so if we have duplicate names in different folders, only one will be copied.
3. Using for
Instead of our previous problem, let’s say we want to copy all files modified on a specific day. So we can use the for loop as the main command, which gets files from ls and copies those files in each step of the loop with the cp command.
Firstly, we filter the files that were changed on a specific day by using ls and grep:
$ ls -ltr | grep "Jan 2"
-rw-r--r--. 1 root root 21793 Jan 2 07:44 file3
drwxr-xr-x. 2 root root 21 Jan 2 07:44 dir1
If we need to copy the files inside the subfolders, we can use cp -r.
We can also copy files that are modified between ‘07:00‘ and ‘07:59‘:
$ for i in `ls -ltr | grep "Jan 2 07:" | awk '{print $9}' `; do cp $i* /root/desFolder; done
Here we used ’07:‘ because grep considers details as text, so it cannot recognize the time.
4. Using cp
Lastly, let’s use cp as the main command and use find to get our desired files from the specified date until now.
We can easily use the cp command to copy files, and also we use find to filter specific files:
$ cp `find . -type f -newermt '1 Jan'` /root/desFolder
If we want to specify the time, we must use date-time in the full format (e.g., DD-MM-YYY HH:MM)
5. Conclusion
There are many ways to copy files based on modification date, and we’ve looked at just three ways. We used the cp command in all of them for copying files. In sum, the usage of these ways is different in ‘how to filter files to copy’ or ‘how to specify the time’.
We may need various arguments of cp in different situations.