1

I want to delete all the files in a folder which are not created today. I know how to get the list of files which are created today using

find . -type f -mtime -1

But, I am not getting how to get the list of all files which are not created today. Basically I have to find if there are files with old timestamp except today in a folder. If present I have to delete only the old files.

1
  • Linux only keeps creation times for ext4 and btrfs as far as I know. -mtime gives the last time that the file was modified in any way including the contents, ownership, permissions, and name changes so neither your command nor those in the answers will delete files which weren't created today. It will delete files which weren't modified today. Commented May 2, 2018 at 16:32

4 Answers 4

7
find . -type f -mtime +0 -exec rm -f {} +

or

find . -type f ! -mtime -1 -exec rm -f {} +

Would remove the regular files whose content has been last modified more than 24 hours ago (-mtime +0 meaning: whose age in days (rounded down to an integer, days are 24 hours, or 86400 Unix epoch second duration) is strictly greater than 0).

Some find implementations have a -delete predicate which you can use in place of -exec rm -f {} + which would make it safer and more efficient.

For files that have been last modified earlier than today 00:00:00, with GNU find, you can add the -daystart predicate. That will include the files that were last modified yesterday even if less than 24 hours ago.

With some find implementations, you can also do:

find . ! -newermt 00:00:00 -delete

To delete files that have been last modified before (or at exactly) 00:00:00 today.

2
  • Better use find . -type f ! -mtime -1 -print | xargs rm -f if there are many such files.
    – vonbrand
    Commented May 3, 2018 at 12:00
  • @vonbrand, no, that has no benefit here over the -exec {} + syntax and breaks for file paths that contain blanks or newlines or quotes or backslash. Commented May 3, 2018 at 12:25
1

Using zsh, either natively or via zsh -c "...":

rm -f /path/to/folder/*(.m+0)     # for that directory only

rm -f /path/to/folder/**/*(.m+0)  # recursively

The parens ( ... ) creates a zsh "glob qualifier". Inside there, a dot . specifies plain files (similar to find's -type f) and the m+0 requires that the file have a modification time that is strictly more than zero days ago, after truncating down to whole days — 23 hours is 0 days; 25 hours would be 1 day.

To even more closely match find's default behavior of finding/matching "hidden" files (that start with a dot), add the capital D qualifier:

rm -f /path/to/folder/*(D.m+0)     # for that directory only

rm -f /path/to/folder/**/*(D.m+0)  # recursively
4
  • 1
    Like for find -mtime +1, *(m+1) is for files whose age in days (rounded down) is strictly greater than 1 (so 2 or more, 48 hours or more). You need *(.m+0) for files at least 24 hour old (find -mtime +0). *(D.m+0) to also include hidden ones like find does. Some find implementations have an alternative syntax: find -mtime +1d that is based on exact times. Commented May 2, 2018 at 17:08
  • 1
    It can be confusing, but the idea is that time is split into one-day chunks. *(m0) is the files modified between 1 day ago and now. *(m1) for the ones between 2 days ago and 1 day ago. *(m+1) is for files older than 2 days ago. Like for find. Commented May 2, 2018 at 17:14
  • Thank you for the clarification, Stéphane! My tests were too coarse to catch the difference. Still forcing myself to become familiar with zsh!
    – Jeff Schaller
    Commented May 2, 2018 at 17:22
  • Ahhh, I see -- the explicit day qualifier would have to come right after the m (or a or c). Thanks again!
    – Jeff Schaller
    Commented May 2, 2018 at 19:39
0

find has the parameter -not or ! which negates the one after and -delete to delete the files:

find . ! -mtime -1 -type f -delete

Note that -not is not POSIX compliant

1
0

When the number of old files than a day is of large amount, I do the below just to be thorough. Get the number of files per day:

$ find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
# Output:
  42315 2020-09-29
  42315 2020-09-30
  42315 2020-10-01
  42315 2020-10-02
  42315 2020-10-03
  42315 2020-10-04
  42315 2020-10-05
   2275 2020-10-06

And to delete all files older than current day:

$ find . -mindepth 1 -type f -mtime +0 | xargs /bin/rm -f
## Now to check the count again.
$ find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
   2275 2020-10-06

Not sure why, but I find that using -exec rm takes a lot of time while piping xargs is quicker.

This site is temporarily in read-only mode and not accepting new answers.

Not the answer you're looking for? Browse other questions tagged .