Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UNIX / BASH: Listing files modified in specific month

I am struggling with listing files modified in specific month (for example, February). Here are several unsuccessful attempts:

1) I tried creating temporary files and setting their timestamp to the first time in the next month and the first time in the target month and use -newer in find, like this:

find -newer "$from" ! -newer "$to"

This lists files modified in the time interval ($from, $to], but I would like the time interval [$from, $to) (otherwise, there would be false positives on files created on the first second in the next month). Listing files modified in February is extra problem, since this would require to set one of the timestamps to the greatest one still in February, but the number of days in February varies depending on whether it is a leap year or not, which requires extra checking.

2) If I use ls I see a lot of complication when parsing, because of the possibility that user name or group contain whitespace.

Is there an easy way and relatively portable way for doing this (so it works for any month, regardless of file names, etc.)?

like image 845
eold Avatar asked Mar 13 '11 12:03

eold


People also ask

How do I list all files modified after a specific date?

You can use the find command to find all files that have been modified after a certain number of days. Note that to find files modified before 24 hours ago, you have to use -mtime +1 instead of -mtime -1 . This will find all files modified after a specific date. How do you list files date wise in Linux?

How do I list files on a specific date in Unix?

4 Answers. You can use the find command to find all files that have been modified after a certain number of days. Note that to find files modified before 24 hours ago, you have to use -mtime +1 instead of -mtime -1 . This will find all files modified after a specific date.

How to find files that have been modified 3 months ago?

find . -type f -mtime +90 finds files that were modified at least 91 days ago (at least in POSIX compliant find implementations). As @hknik says, the -mtime operation on find is likely your best bet, but if you want to get all files around three months ago, then you need a bigger net:

How do I sort files based on month in Linux?

Sorting Files based on Month Here, we use find command to find all files in root (‘/’) directory and then print the result as: Month in which file was accessed and then filename. Of that complete result, here we list out top 11 entries.


2 Answers

date allows you to easily generate timestamps for purposes like that:

date -d "01-Mar-2011 -1 sec" # last second of Feb-2011

Fortunately, the same syntax is possible in find:

month="Mar-2010"
find . -newermt "01-$month -1 sec" -and -not -newermt "01-$month +1 month -1 sec"

will find all files modified in March 2010

like image 130
user123444555621 Avatar answered Oct 11 '22 14:10

user123444555621


Well, I can create files that have the minimum timestamp and the maximum timestamp in February, and files that are just beyond February in each direction.

$ touch -t 201102010000.01 from
$ touch -t 201102282359.59 to
$ touch -t 201103010000.01 march
$ touch -t 201101312359.59 january

$ ls -l
total 0
-rw-r--r-- 1 mike None 0 Feb  1 00:00 from
-rw-r--r-- 1 mike None 0 Jan 31 23:59 january
-rw-r--r-- 1 mike None 0 Mar  1 00:00 march
-rw-r--r-- 1 mike None 0 Feb 28 23:59 to

Then using GNU 'find' like this seems to show just the files whose timestamp is in February.

$ find -newermt '2011-02-01' ! -newermt '2011-03-01' -print
./from
./to

I don't know how portable these arguments are to other versions of 'find'.

like image 28
Mike Sherrill 'Cat Recall' Avatar answered Oct 11 '22 16:10

Mike Sherrill 'Cat Recall'