Linux:使用find查找早于<date>的文件


31

find对于查找比X天前find修改后更多的文件有很好的支持,但是如何使用它来查找在特定日期之后修改过的所有文件?

我无法在find手册页中找到任何可用于执行此操作的功能,只能与另一个文件的时间进行比较,或者检查创建的时间与现在的时间之间的差异。用所需的时间制作文件并与之进行比较是这样做的唯一方法吗?


1
这将能够更好地问上SuperUser.com
约什-布劳尔

6
我不会关闭这个:对于系统管理员也可能很有趣。
splattne

该命令是备份脚本的一部分,该脚本从/ etc中获取在夜间备份中安装后更改的所有内容。
DrStalker 2010年

我只有九岁,当我主持一个新答案时才注意到:这个问题的标题和正文并不相同。标题要求“早于<date>的文件”,但正文指出“在特定日期之后已修改”。我将“之后”解释为比特定日期新,而不是较旧。
乔佛里

Answers:


19

如果只有“较新的文件”,则可以采用以下解决方法:

touch -t 201003160120 some_file
find . -newer some_file

男人碰:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

假设您的触摸具有此选项(我的触摸为5.97)。


48

不可以,您可以使用日期/时间字符串。

来自man find

-newerXY reference
将当前文件的时间戳与引用进行比较。reference参数通常是文件名(其时间戳之一用于比较),但也可以是描述绝对时间的字符串。X和Y是其他字母的占位符,这些字母选择属于参考的方式用于比较的时间。

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

例:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls

5
我使用的Centos 5.2使用GNU查找版本4.2.27,它不支持-newermt或除-newer文件以外的任何-newer参数
DrStalker 2010年


25

与问题没有直接关系,但对于在这里绊倒的人可能会很有趣。

find命令不直接支持-older参数来查找早于某些必需日期的文件,但是您可以使用negate语句(使用接受的答案示例):

touch -t 201003160120 some_file
find . ! -newer some_file

将返回于提供日期的文件。


3
编辑-也许应该将其合并为可接受的答案?
nEJC 2012年

此解决方案是解决此类问题的最优雅的方法:)
Labynocle 2015年

9
find <dir> -mtime -20

该find命令将查找最近20天内修改的文件。

  • mtime->修改(atime =已访问,ctime =已创建)
  • -20->少于20天(20天恰好是20天,+ 20天超过20天)

您可以添加其他限制,例如:

find <dir> -mtime -20 -name "*.txt"

与以前相同,但仅查找以'.txt'结尾的文件。


5

只是要添加-您甚至可以使用两个newermt参数在一个时间间隔内进行搜索:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

查找2007年3月以来的所有文件。


1

您可以使用这样的脚本

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

将其保存为$ newerthan并使其可执行。

然后,您可以找到在特定日期之后修改的文件,如下所示:

newerthan "2010-03-10"

要么

newerthan "last year"

要么

newerthan "yesterday"

那应该做你想要的。我不认为没有内置的方法可以实现此目的。


不需要使用bc整数数学,Bash可以做到:((seconds = when - now)),to的format参数date应该有一个加号date +%s,某些系统可能没有date -d
暂停,直到另行通知。

这是针对Centos 5.2的。哪有-d。有助于了解整数数学。
理查德·霍洛威

1
find ! -newermt “<DATE>”

像这样:

find ! -newermt “jan 01 2015” 

这将为您提供当前目录中早于2015年1月1日的文件。

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/


我正要在ServerFault上发表欢迎您的评论,并要求您重新考虑重复答案,直到我意识到问题标题和正文说出不同的东西:标题要求“早于<date>的文件”且问题状态为“修改过”在某个日期之后”,我认为这是两件事。也许您可以在自己的帖子中阐明区别并解释否定词的用法。感谢您的贡献,我将对这个问题发表评论以进行澄清。感谢您的贡献!
乔佛里

0

如果您将日期格式设置为可以比较,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.