如何使用“查找”来搜索在特定日期创建的文件? [关闭]

Posted

技术标签:

【中文标题】如何使用“查找”来搜索在特定日期创建的文件? [关闭]【英文标题】:How to use 'find' to search for files created on a specific date? [closed] 【发布时间】:2010-09-14 13:20:32 【问题描述】:

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

【问题讨论】:

【参考方案1】:

你可以这样做:

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

【讨论】:

这是大多数人想要的,但它没有得到足够的支持!!! 这可能不适用于在一个目录中有几百万个文件。 文件名中有grep搜索词会有副作用。 mywiki.wooledge.org/ParsingLs -- 更好的方法可能是以机器可读的形式打印创建日期,如果没有find -printf,可能使用stat【参考方案2】:

正如 Max 所指出的,您不能,但检查已修改或访问的文件并不是那么难。我写了一封tutorial 关于这个,直到今天。其中的本质是使用-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”通常对应于创建日期。

【讨论】:

我的 find (GNU 4.2.32) 版本似乎不支持 -newerXY 谓词。是否需要特定的最低版本?还是使用特殊的配置开关编译 find 的情况? @yukondude:你是对的。我在本地拥有的 find 版本——GNU 4.4.0——有它,而我在 Dreamhost 上拥有的 4.1.20 没有。不过,创建两个文件的组合应该适用于任何一个。 在某些系统(FreeBSD、OS/X...)上,-newerBt 将匹配文件的出生(创建)时间。 请注意,-newerxt 自 2001 年起在 FreeBSD 上可用(在 1998 年首次提供 as a patch),其他一些 BSD 和 GNU 发现(自 2007 年 4.3.3 起) ,基于 HP/UX find,它引入了-newerXY(但不支持 Y == t)。 请注意,如果您启用了 Bash 历史记录替换(这是默认设置),感叹号可能需要转义 (\!)。或者您可以使用set +H 禁用它。【参考方案3】:
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

【讨论】:

为什么要复制文件?除了`ls ...` 中的命令有效外,它不使用find 工具。【参考方案4】:

@Max: 关于创建时间是对的。

但是,如果您想计算 -atime-ctime-mtime 参数之一的经过天数参数,则可以使用以下表达式

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

将“2008-09-24”替换为您想要的任何日期,ELAPSED_DAYS 将设置为从那时到今天的天数。 (更新:从结果中减去一个以与 find 的日期四舍五入对齐。)

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

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

如果您的find 版本不支持@Arve: 的答案中提到的-newerXY 谓词,这将起作用。

【讨论】:

【参考方案5】:

这是两个步骤,但我喜欢这样做:

首先创建一个具有特定日期/时间的文件。在这种情况下,文件是 2008-10-01 午夜

touch -t 0810010000 /tmp/t

现在我们可以找到所有比上述文件新或旧的文件(按文件修改日期。您也可以使用 -anewer 访问和 -cnewer文件状态已更改)。

find / -newer /tmp/t
find / -not -newer /tmp/t

您还可以通过触摸创建两个文件来查看特定日期之间的文件

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

这将找到两个日期和时间之间的文件

find / -newer /tmp/t1 -and -not -newer /tmp/t2

【讨论】:

+1 用于解决缺少-newerXY的旧find IMO,现在这应该是公认的解决方案。我无法让 -newermt 在 2.6.18-348.18.1.el5 内核上运行,更不用说更新的内核了。 DarkForce 也一样,newermt 功能似乎非常非常不稳定【参考方案6】:

你不能。 -c 开关告诉您上次更改权限的时间,-a 测试最近的访问时间,-m 测试修改时间。大多数 Linux (ext3) 使用的文件系统不支持“创建时间”记录。对不起!

【讨论】:

事实上,不仅仅是文件系统类型——没有系统接口来获取这些信息,即使文件系统持有它。 Unix 的缺陷之一可以追溯到早期,这就是 Unix 永远不会起飞的原因。 Unix 永远不会起飞?【参考方案7】:

find location -ctime time_period

time_period 示例:

30多天前:-ctime +30

不到 30 天前:-ctime -30

正好 30 天前:-ctime 30

【讨论】:

问题是我想测试一个特定的日期,而不是一个时间段内。 算出那是多少天前并使用那个数字。 ctime创建时间无关,是inode更改时间。【参考方案8】:

通过查找 -atime、-ctime 和 -mtime 开关,您可以接近您想要实现的目标。

【讨论】:

【参考方案9】:

我在删除所有超过 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 等参数将在这里为您提供帮助。

【讨论】:

以上是关于如何使用“查找”来搜索在特定日期创建的文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery DataTables 插件在特定列中搜索?

如何使用谷歌应用程序脚本查找任务列表中特定日期的任务

将名称添加到日期范围搜索。微软访问 VBA

如何快速搜索项目中所有包含的头文件以查找特定符号?

如何在特定日期间隔内查找

ubuntu中在终端下如何查找具有某一特定字符串的文件?