如何查找在最后 x 分钟修改的文件(find-mmin 不能按预期工作)

我试图找到在最后 x 分钟修改过的文件,例如在最后一个小时。网上的许多论坛和教程建议使用 find 命令和 -mmin 选项,如下所示:

find . -mmin -60 |xargs ls -l

然而,这个命令并没有像预期的那样对我起作用。从下面的清单中可以看到,它还显示了1小时前修改过的文件:

-rw------- 1 user user   9065 Oct 28 23:13 1446070435.V902I67a5567M283852.harvester
-rw------- 1 user user   1331 Oct 29 01:10 1446077402.V902I67a5b34M538793.harvester
-rw------- 1 user user   1615 Oct 29 01:36 1446078983.V902I67a5b35M267251.harvester
-rw------- 1 user user  72365 Oct 29 02:27 1446082022.V902I67a5b36M873811.harvester
-rw------- 1 user user  69102 Oct 29 02:27 1446082024.V902I67a5b37M142247.harvester
-rw------- 1 user user   2611 Oct 29 02:34 1446082482.V902I67a5b38M258101.harvester
-rw------- 1 user user   2612 Oct 29 02:34 1446082485.V902I67a5b39M607107.harvester
-rw------- 1 user user   2600 Oct 29 02:34 1446082488.V902I67a5b3aM465574.harvester
-rw------- 1 user user  10779 Oct 29 03:27 1446085622.V902I67a5b3bM110329.harvester
-rw------- 1 user user   5836 Oct 29 03:27 1446085623.V902I67a5b3cM254104.harvester
-rw------- 1 user user   8970 Oct 29 04:27 1446089232.V902I67a5b3dM936339.harvester
-rw------- 1 user user 165393 Oct 29 06:10 1446095400.V902I67a5b3eM290158.harvester
-rw------- 1 user user 105054 Oct 29 06:10 1446095430.V902I67a5b3fM265065.harvester
-rw------- 1 user user   1615 Oct 29 06:24 1446096244.V902I67a5b40M55701.harvester
-rw------- 1 user user   1620 Oct 29 06:24 1446096292.V902I67a5b41M337769.harvester
-rw------- 1 user user  10436 Oct 29 06:36 1446096973.V902I67a5b42M707215.harvester
-rw------- 1 user user   7150 Oct 29 06:36 1446097019.V902I67a5b43M415731.harvester
-rw------- 1 user user   4357 Oct 29 06:39 1446097194.V902I67a5b56M446687.harvester
-rw------- 1 user user   4283 Oct 29 06:39 1446097195.V902I67a5b57M957052.harvester
-rw------- 1 user user   4393 Oct 29 06:39 1446097197.V902I67a5b58M774506.harvester
-rw------- 1 user user   4264 Oct 29 06:39 1446097198.V902I67a5b59M532213.harvester
-rw------- 1 user user   4272 Oct 29 06:40 1446097201.V902I67a5b5aM534679.harvester
-rw------- 1 user user   4274 Oct 29 06:40 1446097228.V902I67a5b5dM363553.harvester
-rw------- 1 user user  20905 Oct 29 06:44 1446097455.V902I67a5b5eM918314.harvester

事实上它只是列出了工作目录里的所有文件。我们可以以这些文件中的一个为例,检查它的修改时间是否真的如 ls 命令所显示的那样:

stat 1446070435.V902I67a5567M283852.harvester


File: ‘1446070435.V902I67a5567M283852.harvester’
Size: 9065        Blocks: 24         IO Block: 4096   regular file
Device: 902h/2306d  Inode: 108680551   Links: 1
Access: (0600/-rw-------)  Uid: ( 1001/   user)   Gid: ( 1027/   user)
Access: 2015-10-28 23:13:55.281515368 +0100
Modify: 2015-10-28 23:13:55.281515368 +0100
Change: 2015-10-28 23:13:55.313515539 +0100

正如我们所看到的,这个文件肯定是最后一次修改 早些时候比1小时前!我也尝试了 find -mmin 60find -mmin +60,但它也没有工作。

为什么会发生这种情况,以及如何正确使用 find 命令?

217707 次浏览

如果在过去一个小时内修改的目录中有 没有文件,我可以重现您的问题。在这种情况下,find . -mmin -60不返回任何值。但是,命令 find . -mmin -60 |xargs ls -l返回目录中的每个文件,这与在没有参数的情况下运行 ls -l时所发生的情况一致。

要确保只有在找到文件时才运行 ls -l,请尝试:

find . -mmin -60 -type f -exec ls -l {} +

这个命令可能对你有帮助,长官

find -type f -mtime -60

查找手册:

   Numeric arguments can be specified as


+n     for greater than n,


-n     for less than n,


n      for exactly n.


-amin n
File was last accessed n minutes ago.


-anewer file
File was last accessed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the access time of the file it points  to  is  always
used.


-atime n
File  was  last  accessed  n*24 hours ago.  When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.


-cmin n
File's status was last changed n minutes ago.


-cnewer file
File's status was last changed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the status-change time of the file it  points
to is always used.


-ctime n
File's status was last changed n*24 hours ago.  See the comments for -atime to understand how rounding affects the interpretation of file status change times.

例如:

find /dir -cmin -60 # creation time
find /dir -mmin -60 # modification time
find /dir -amin -60 # access time

这可能对您有用。我使用它在部署期间清理文件夹,以删除旧的部署文件。

clean_anyfolder() {
local temp2="$1/**"; //PATH
temp3=( $(ls -d $temp2 -t | grep "`date | awk '{print $2" "$3}'`") )
j=0;
while [ $j -lt ${#temp3[@]} ]
do
echo "to be removed ${temp3[$j]}"
delete_file_or_folder ${temp3[$j]} 0 //DELETE HERE
fi
j=`expr $j + 1`
done
}

问题是

find . -mmin -60

产出:

.
./file1
./file2

注意到有一个点的那条线了吗?
这使得 ls列出的整个目录与执行 ls -l .时完全相同。

一种解决方案是只列出文件(而不是目录) :

find . -mmin -60 -type f | xargs ls -l

但最好直接使用 find 的 option-exec:

find . -mmin -60 -type f -exec ls -l {} \;

或者只是:

find . -mmin -60 -type f -ls

顺便说一句,它是安全的,甚至包括目录:

find . -mmin -60 -ls

事实上,不止一个问题。主要的一点是,xargs默认执行您指定的命令,即使没有传递任何参数。要改变这一点,可以在 xargs中使用 GNU 扩展:

如果是空的就不要跑
R
如果标准输入不包含任何非空格,则不要运行该命令。通常,即使没有输入,该命令也只运行一次。此选项是 GNU 扩展。

举个简单的例子:

find . -mmin -60 | xargs -r ls -l

但是这可能与所有子目录相匹配,包括 .(工作目录) ,并且 ls将单独列出每个子目录。所以输出会一团糟。解决方案: 将 -d传递给 ls,这将禁止列出目录内容:

find . -mmin -60 | xargs -r ls -ld

现在你不喜欢你列表中的工作目录了?解决方案: 从查找输出中排除第一个目录级别(0) :

find . -mindepth 1 -mmin -60 | xargs -r ls -ld

现在你只需要列表中的文件了? 解决方案: 排除目录:

find . -type f -mmin -60 | xargs -r ls -l

现在您有一些名称包含空白、引号或反斜杠的文件了吗?解决方案: 使用以 null 结尾的输出(find)和输入(xargs)(这些也是 GNU 扩展,afaik) :

find . -type f -mmin -60 -print0 | xargs -r0 ls -l

我正在通过相同的需要,我相信你的时间框架是不正确的。

试试这些:

  • 15分钟的变化: 发现。-时间 -.01
  • 1小时更改: 查找
  • 12小时变化: 发现。-时间 -5

你应该以24小时为基准。之后的时间应该是相对于24小时。因此 -.5等于12小时,因为12小时等于24小时的一半。

要搜索/target _ 目录及其所有子目录中在过去60分钟内修改过的文件:

$ find /target_directory -type f -mmin -60

要查找最新修改的文件,按照更新时间的倒序排序(即,先查找最新更新的文件) :

$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r