如何使用“find”命令搜索特定日期创建的文件?

305

我该如何使用UNIX命令find来搜索在特定日期创建的文件?

9个回答

398

正如Max指出的那样,你不能直接查找创建日期,但查找修改或访问过的文件并不难。我今天写了一篇关于此的教程。其核心是使用-newerXY! -newerXY

例如:要查找所有于2007年6月7日修改的文件:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

要查找所有于2008年9月29日访问的文件:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

或者,同一天权限被更改的文件:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

如果你不改变文件的权限,'c' 通常会对应于创建日期。


7
我的 find 版本(GNU 4.2.32)好像不支持 -newerXY 属性。需要特定的最低版本吗?还是需要使用特殊配置开关编译 find 呢? - yukondude
1
@yukondude:你说得对。我本地的find版本——GNU 4.4.0——有它,而我在Dreamhost上拥有的4.1.20没有。不过,使用创建两个文件的方法应该在任何一个版本中都可以解决问题。 - Arve
1
在某些系统上(FreeBSD,OS/X...),-newerBt 将匹配文件的 _birth_(创建)时间。 - Stephane Chazelas
3
请注意,-newerxt 自 2001 年起在 FreeBSD 上可用(最初在1998年作为补丁 提供),还有其他一些 BSD 和 GNU find(自 2007 年的 4.3.3 版本开始),它们基于 HP/UX find,该版本引入了 -newerXY(但其中 Y == t 不受支持)。 - Stephane Chazelas
1
链接的教程(http://www.virtuelvis.com/2008/10/how-to-use-find-to-search-for-files-created-on-a-specific-date/)已失效。 - Dawid Moś
显示剩余3条评论

84

使用此命令在/home/上搜索文件和文件夹,并根据您的需求添加时间段:

find /home/ -ctime time_period

time_period示例:

  • 30天前以上:-ctime +30

  • 30天前以下:-ctime -30

  • 正好30天前:-ctime 30


9
问题在于我想测试一个具体日期,而不是一个时间段。 - sverrejoh
1
因此,计算出那是多少天前,然后使用该数字。 - jmanning2k
29
ctime与“创建时间”无关,它是指inode更改时间。 - Stephane Chazelas

53

这是一个两步操作,但我喜欢这样做:

首先创建一个具有特定日期/时间的文件。在本例中,文件为2008年10月1日午夜创建。

touch -t 0810010000 /tmp/t

现在我们可以查找所有比上述文件更新或更旧的文件(按文件修改日期排序)。您还可以使用-anewer来查找访问时间更新的文件,或使用-cnewer查找文件状态改变的文件。
find / -newer /tmp/t
find / -not -newer /tmp/t

您可以通过创建两个使用 touch 命令的文件来查看某些日期之间的文件。
touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

这将查找在两个日期和时间之间的文件。
find / -newer /tmp/t1 -and -not -newer /tmp/t2

4
+1 用于解决旧版“find”缺少“-newerXY”的问题 - Felipe Alvarez
1
在我看来,现在这应该是被接受的解决方案。我无法在2.6.18-348.18.1.el5内核上运行-newermt,更不用说更新的内核了。 - DarkForce
这里也一样,DarkForce。新的mt功能似乎非常地不稳定。 - niken

42

你可以这样做:

find ./ -type f -ls |grep '10 Sep'

例子:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24

这是大多数人想要的,但它没有获得足够的赞成票! - sjas
3
这可能在一个目录中拥有数百万个文件时无法正常工作。 - Dennis Nolte
5
如果grep搜索词在文件名中,就会有副作用。 - Snorex
https://mywiki.wooledge.org/ParsingLs -- 更好的方法可能是以机器可读的形式打印创建日期,如果您没有find -printf,可以使用stat - tripleee
关于“百万文件”,如果这个日期在最近60天内,请使用find ./ -type f -mtime -60 -ls | grep '10 Sep' - mgutt

14

你不能。-c选项告诉你最后更改权限的时间,-a选项测试最近的访问时间,-m选项测试修改时间。Linux大多数版本使用的文件系统(ext3)不支持“创建时间”记录。抱歉!


8
事实上,不仅仅是文件系统类型——即使文件系统保存了这些信息,也没有系统接口可以获取这样的信息。这是Unix从早期开始存在的缺陷之一,这也是为什么Unix永远不会流行起来的原因。 - chrisdowney
3
Unix永远不会流行起来? - lucid_dreamer

8

@Max: 关于创建时间的说法是正确的。

然而,如果你想计算一个 -atime-ctime-mtime 参数的经过天数参数,你可以使用以下表达式

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

将“2008-09-24”替换为您想要的日期,ELAPSED_DAYS将被设置为该日期与今天之间的天数。(更新:从结果中减去1以与find的日期舍入对齐。)

因此,要查找任何在2008年9月24日修改的文件,命令应为:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

如果您的版本的find不支持@Arve答案中提到的-newerXY谓词,则此方法可行。

3
使用find命令的-atime、-ctime和-mtime选项,您可以接近您想要实现的目标。

-4
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

2
你为什么要复制这些文件?除了在“\ls ...”命令中使用,它并没有使用“find”工具。 - Yamaneko
https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-to-do-instead - Danin

-6
我在一个删除所有14天前文件的脚本中发现了这个小脚本:
CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

我认为稍微额外使用一下"man find"并查找-ctime / -atime等参数会对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接