278

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

4

9 回答 9

366

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

于 2008-10-01T15:30:48.250 回答
76

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

find /home/ -ctime time_period

time_period 的示例:

  • 30 多天前:-ctime +30

  • 不到 30 天前:-ctime -30

  • 正好 30 天前:-ctime 30

于 2008-10-01T15:03:58.750 回答
49

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

首先创建一个具有特定日期/时间的文件。在这种情况下,文件是 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
于 2008-10-01T15:05:07.390 回答
39

你可以这样做:

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
于 2008-10-01T15:01:26.887 回答
12

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

于 2008-10-01T15:08:24.607 回答
8

@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不支持-newerXY@Arve:'s answer中提到的谓词,这将起作用。

于 2008-10-01T15:23:39.280 回答
2

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

于 2008-10-01T15:03:30.390 回答
-4
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
于 2011-10-24T15:53:32.373 回答
-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 等参数将在这里为您提供帮助。

于 2008-10-01T15:02:40.923 回答