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


254

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


8
似乎允许bash脚本问题。
艾伦(Alan)

@MichaelScheper:我什至不知道从哪里开始评论。
Lightness Races in Orbit

1
@Notinlist:答案是:meta.stackexchange.com/questions/10249/…不幸的是,事实证明时限已经过期。可惜,因为网络搜索仍然落在这里,而且被接受的答案对很多人都有帮助。
Michael Scheper 2015年

@MichaelScheper:如果您可以找到一个投票选择迁移到unix.stackexchange.com的选项,请务必向我指出。由于您没有代表来查看关闭对话框,因此我将给您一个提示:没有提示。当您不知道自己在说什么时,考虑减少战斗力。感谢您的关注。
Lightness Races in Orbit

5
@LightnessRacesinOrbit:我为“好斗”而道歉。我不允许编辑我的评论,但是为了将来参考,我的评论是否赞扬了冒犯您的问题?我必须说,即使在给您先前的评论带来怀疑的好处之后,我仍然感觉有点盲目。通过查找迁移的工作原理,我实际上是在尝试比添加另一个“我也是”更具建设性:meta.stackexchange.com/a/10250/249555 60天的期限可能隐藏了该选项?对不起,屁股转向。再次真诚地感谢您的时间和关注。
Michael Scheper

Answers:


323

正如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谓词。是否需要特定的最低版本?还是使用特殊的configure开关编译find的情况?
育空地

1
@yukondude:你是对的。我在本地拥有的find版本-GNU 4.4.0-拥有它,而我在Dreamhost上拥有的4.1.20没有。但是,创建两个文件的合并应该在其中一个中都起作用。
Arve

1
在某些系统(FreeBSD,OS / X ...)-newerBt上,文件的诞生(创建)时间将匹配。
Stephane Chazelas 2014年

3
请注意,FreeBSD自2001年(在1998年首次作为修补程序-newerxt提供)开始在FreeBSD上可用,另外一些BSD和GNU find(自2007年4.3.3起)基于HP / UX find引入了,但是不支持Y == t)。-newerXY
Stephane Chazelas 2014年

使用:find(GNU findutils)4.4.0,此语法在SUSE ext3上不起作用,如果应该在该日期列出文件/ w mtime,则不会返回任何内容
niken 2015年

68

find location -ctime time_period

time_period的示例:

  • 30多天前: -ctime +30

  • 不到30天前: -ctime -30

  • 恰好30天前: -ctime 30


7
问题是我想测试一个特定的日期,而不是某个时间段。
sverrejoh,

1
因此找出那是多少天前并使用该数字。
jmanning2k

15
ctime创建时间无关,它是inode更改时间。
Stephane Chazelas 2014年

47

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

首先创建具有特定日期/时间的文件。在这种情况下,文件是午夜的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

3
+1解决find缺乏的老年人-newerXY
费利佩·阿尔瓦雷斯

1
IMO,现在这应该是公认的解决方案。我无法让-newermt在2.6.18-348.18.1.el5内核上运行,更不用说较新的内核了。
DarkForce 2015年

黑暗力量(DarkForce)同样如此,更新的功能似乎非常
不可思议

34

您可以这样做:

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 2015年

2
这可能无法在一个目录中拥有数百万个文件的情况。
丹尼斯·诺尔特

3
如果grep搜索项位于文件名中,则会产生副作用。
Snorex

mywiki.wooledge.org/ParsingLs-更好的方法可能是以机器可读的形式打印创建日期,stat如果没有的话,也可以打印出来find -printf
Tripleee'4

12

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


7
实际上,这不仅是文件系统类型-即使文件系统保存了信息,也没有用于获取此类信息的系统接口。Unix的缺陷可以追溯到最早的日子,这就是Unix永远不会起飞的原因。
chrisdowney 2011年

1
Unix永远不会腾飞?
lucid_dreamer '19

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


2

使用-atime,-ctime和-mtime开关来查找,您可以接近想要实现的目标。


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

1
为什么要复制文件?除了有效的命令外`ls ...`,它不使用该find工具。
Yamaneko

-5

我在删除所有超过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

我认为一些其他的“查找人”和寻找-ctime / -atime等参数将在这里为您提供帮助。

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.