查找在日期范围之间创建的文件

我在工作中通过 telnet 使用 AIX,我想知道如何在日期范围之间的特定文件夹中查找文件。例如: 我想找到文件夹 X 中的所有文件是在01-8月13日和31-8月13日之间创建的。

观察结果:

  • 一旦我在服务器上的用户角色不允许我创建文件,那么 touch技巧(创建两个空文件以使用-new 选项)对我就不起作用了。
  • 我需要找到具体的日期之间,而不是天(如: 文件创建超过30天前,等等)
193253 次浏览

使用 stat获取创建时间。您可以按照 YYYY-MM-DD HH:MM:SS字典格式比较时间。

这个工作在 Linux 上需要修改时间,不支持创建时间。在 AIX,abc0选项可能不受支持,但你应该能够获得的信息,无论如何,使用 grep,如果没有其他工作。

#! /bin/bash
from='2013-08-01 00:00:00.0000000000' # 01-Aug-13
to='2013-08-31 23:59:59.9999999999'   # 31-Aug-13


for file in * ; do
modified=$( stat -c%y "$file" )
if [[ $from < $modified && $modified < $to ]] ; then
echo "$file"
fi
done

您可以使用下面的内容来找到您需要的内容。

查找比特定日期/时间更早的文件:

find ~/ -mtime $(echo $(date +%s) - $(date +%s -d"Dec 31, 2009 23:59:59") | bc -l | awk '{print $1 / 86400}' | bc -l)

或者你可以找到两次约会之间的文件。第一次约会时间更近,最后一次约会时间更长。你可以去二楼,不用浪费时间。你想用什么都行。

find . -mtime $(date +%s -d"Aug 10, 2013 23:59:59") -mtime $(date +%s -d"Aug 1, 2013 23:59:59")

如果你使用 GNUfind,从4.3.3版本开始,你可以这样做:

find -newerct "1 Aug 2013" ! -newerct "1 Sep 2013" -ls

它将接受 GNU date -d接受的任何日期字符串。

您可以将 -newerct中的 c更改为 aBcm中的任何一个,以查看 time/born/ctime/mtime。

2017年11月6日17:30至22:00之间修改的另一个示例列表文件:

find -newermt "2017-11-06 17:30:00" ! -newermt "2017-11-06 22:00:00" -ls

man find提供的详细资料:

   -newerXY reference
Compares the timestamp of the current file with reference.  The reference argument is normally the name of a file (and one of its timestamps  is  used
for  the  comparison)  but  it may also be a string describing an absolute time.  X and Y are placeholders for other letters, and these letters select
which time belonging to how reference is used for the comparison.


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


Some combinations are invalid; for example, it is invalid for X to be t.  Some combinations are not implemented on all systems; for example B  is  not
supported on all systems.  If an invalid or unsupported combination of XY is specified, a fatal error results.  Time specifications are interpreted as
for the argument to the -d option of GNU date.  If you try to use the birth time of a reference file, and the birth time cannot be determined, a fatal
error  message  results.   If  you  specify a test which refers to the birth time of files being examined, this test will fail for any files where the
birth time is unknown.

尝试以下命令:

find /var/tmp -mtime +2 -a -mtime -8 -ls

这将允许您在 /var/tmp文件夹中查找超过 2天但不超过 8天的文件。

这里有一些很好的解决方案,想和大家分享一下我的解决方案,因为它很简短。

我使用 find (GNU findutils)4.5.11

$ find search/path/ -newermt 20130801 \! -newermt 20130831

编写旧文件脚本

我试图以一种更完整的方式来回答这个问题,最后我创建了一个完整的脚本,其中包含帮助您理解 find命令的选项。

脚本 oldfiles在这个 储存库

要“创建”一个新的 find 命令,您可以使用选项 -n(模拟运行)运行它,它将向您打印您需要使用的正确 find命令。

当然,如果省略了 -n,它只会运行,不需要重新键入 find命令。

用法:

oldfiles [-v...] ([-h|-V|-n] | {[(-a|-u) | (-m|-t) | -c] (-i | -d | -o| -y | -g) N (-\> | -\< | -\=) [-p "pat"]})
  • 将备选办法分为以下几类:
    • 帮助及资讯:

帮忙,给我看看这个。
- V-版本: 显示版本。
- v,——冗长: 打开冗长模式(累积)。
- n,—— dry-run: 不要运行,只是解释如何创建“ find”命令

  • 时间类型(访问/使用、修改时间或更改状态) :

- a 或-u: 访问(使用)时间
- m 或-t: 修改时间(默认值)
- c: inode 状态更改

  • 时间范围(其中 N 是一个正整数) :

- i N: 分钟(默认值为 N 等于1分钟)
- d N: 天
几个月
几年了
- g N: N 是日期(例如: “2017-07-0622:17:15”)

  • 测试:

- p“ Pat”: 匹配的可选模式(例如:-p”* 。查找 c 文件)(缺省值-p“ *”)
- > : file 比给定的范围更新,即,在它之后修改的时间。
- < : file 大于给定的范围,即时间是从之前开始的。(默认)
- = : 正好是 N (分钟,天,月,年)的文件。

例如:

  • 查找10分钟以内的 C 源文件(访问时间)(详细程度为3) :

    oldfiles -a -i 10 -p"*.c" -\> -nvvv
    Starting oldfiles script, by beco, version 20170706.202054...
    oldfiles -vvv -a -i 10 -p "*.c" -\> -n
    Looking for "*.c" files with (a)ccess time newer than 10 minute(s)
    find . -name "*.c" -type f -amin -10 -exec ls -ltu --time-style=long-iso {} +
    Dry-run
    
  • 查找超过一个月的 H 头文件(修改时间)(详细度2) :

    oldfiles -m -o 1 -p"*.h" -\< -nvv
    Starting oldfiles script, by beco, version 20170706.202054...
    oldfiles -vv -m -o 1 -p "*.h" -\< -n
    find . -name "*.h" -type f -mtime +30 -exec ls -lt --time-style=long-iso {} +
    Dry-run
    
  • 在一天之内查找所有(*)文件(2016年12月1日; 无冗长,模拟运行) :

    oldfiles -mng "2016-12-01" -\=
    find . -name "*" -type f -newermt "2016-11-30 23:59:59" ! -newermt "2016-12-01 23:59:59" -exec ls -lt --time-style=long-iso {} +
    

当然,删除 -n程序将运行 find命令本身,并节省您的麻烦。

我希望这可以帮助大家最终了解这个 {a,c,t}{time,min}选项。

一次总付产出:

您还会注意到,ls选项 ls OPT会根据您选择的时间类型进行更改。

链接到 oldfiles脚本的克隆/下载:

Https://github.com/drbeco/oldfiles

说明 : 使用带有 -ctime(创建时间)标志的 unix 命令 find

find实用程序为列出的每个路径递归地下降目录树,根据树中的每个文件计算表达式(由“主要”和“操作数”组成)。

解决方案 : 根据官方文件:

-ctime n[smhdw]
If no units are specified, this primary evaluates to true if the difference
between the time of last change of file status information and the time find
was started, rounded up to the next full 24-hour period, is n 24-hour peri-
ods.


If units are specified, this primary evaluates to true if the difference
between the time of last change of file status information and the time find
was started is exactly n units.  Please refer to the -atime primary descrip-
tion for information on supported time units.

公式 :

find <path> -ctime +[number][timeMeasurement] -ctime -[number][timeMeasurment]

例子 :

1. 查找1周前和2周前创建的所有内容。

find / -ctime +1w -ctime -2w

2. 找出所有在一天前至三天前创建的 javascript 文件(.js)的工作目录。

find . -name "*\.js" -type f -ctime +1d -ctime -3d

您可以使用以下命令列出两个特定日期之间的文件:

搜索当前(.)目录:

find . -type f -newermt "2019-01-01" ! -newermt "2019-05-01"

搜索 /var/any/directory/目录:

find /var/any/directory/ -type f -newermt "2019-01-01" ! -newermt "2019-05-01"