![查找 X 分钟前创建的文件(没有 GNU/BSD 查找)](https://linux22.com/image/40547/%E6%9F%A5%E6%89%BE%20X%20%E5%88%86%E9%92%9F%E5%89%8D%E5%88%9B%E5%BB%BA%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%88%E6%B2%A1%E6%9C%89%20GNU%2FBSD%20%E6%9F%A5%E6%89%BE%EF%BC%89.png)
我正在使用该find
命令查找 30 分钟内创建的文件。
find . -ctime -30m
但它最多会提供 30 天的文件。我也尝试过,-mmin
但它表明这-mmin
不是一个有效的选项。
find
我的命令有什么问题吗?
的输出uname -rs
是AIX 2
.
答案1
AIXfind
缺乏良好的 GNU 功能。
您可以轻松解决这个问题。创建两个带有标记感兴趣边界的时间戳的“参考”文件:
touch -amt 201407251200 myref1
touch -amt 201407251230 myref2
现在做:
find . -type f \( -newer myref1 -a ! -newer myref2 \) -exec ls -ld {} +
这引用文件的mtime
时间或修改时间。如果没有对其进行进一步的修改(写入),这将是文件的创建时间戳,否则它将代表上次对文件进行更改的时间数据。对于目录,mtime
当添加新对象或删除旧对象时, 会更新。经典 Unix/Linux 缺乏真正的创建时间戳,尽管这是在某些平台上实现的(并且可用于检索)。 (进一步参见这里。 MAC OS 用户可以使用“ls -lU”来获取它。
不要ctime
与“创造”混淆。 stat ctime
() 结构的 代表 inode 更改的最后时间戳(即权限、所有权和对象名称)。
答案2
来补充@JR弗格森的回答。
要获取修改时间为过去30分钟的参考文件,可以进行可移植的操作(精度为一秒):
TZ=ZZZ0 touch -t "$(TZ=ZZZ0:30 date +%Y%m%d%H%M.%S)" /some/ref/file
然后执行以下操作:
find . -newer /some/ref/file
这只适用于 50 小时的间隔:
TZ=ZZZ-24:59:59 touch -t "$(TZ=ZZZ24:59:59 date +%Y%m%d%H%M.%S)" file
这是您可以使用该方法以可移植方式(POSIXly)获取的最旧的文件。
答案3
你应该使用-cmin
.从man
的页面find
,
-cmin n
File’s status was last changed n minutes ago.
-ctime n
File’s status was last changed n*24 hours ago. See the comments for -atime to understand how rounding affects the interpreta-
tion of file status change times.
答案4
您可以使用perl
:
#! /usr/bin/perl
use strict;
use warnings;
use File::Find ();
use File::stat;
use vars qw(*name);
*name = *File::Find::name;
my $now = time;
File::Find::find({wanted => \&wanted}, '.');
sub wanted {
print "$name\n" if stat($_)->mtime > ($now - 30*60)
and $name ne ".";
}
除了OSX
或FreeBSD
(使用ls -U
),您无法获取文件的创建日期。
如果您在ext2/3/4
文件系统上,则可以使用调试文件获取文件的创建日期。