【问题标题】:Find command not working with -mtime and -daystart parameter in linux-bash在 linux-bash 中查找命令不适用于 -mtime 和 -daystart 参数
【发布时间】:2024-07-29 11:20:02
【问题描述】:

我正在尝试在find 命令中查找 10 分钟前创建并使用 -daystart 参数(即创建/修改时间超过 10 分钟但小于 daystart)的文件,但 -mmin 正在使用优先级和-daystart 被忽略。任何解决此问题的建议和 cmet 表示赞赏。

下面的输出显示-daystart 被忽略,理想情况下应该只列出test 文件:

[rshetty@xxx ~]$ date 
Thu Feb 23 12:06:14 CST 2017 
[rshetty@xxx ~]$ find . -maxdepth 1 -type f -daystart -mmin +10 -exec ls -lrt {} \; 
-rw-r--r--. 1 rshetty users 18 Jan 11 2015 ./.bash_logout 
-rw-r--r--. 1 rshetty users 0 Feb 23 11:50 ./test 
-rw-r--r--. 1 rshetty users 231 Jan 11 2015 ./.bashrc 
-rw-r--r--. 1 rshetty users 193 Jan 11 2015 ./.bash_profile

【问题讨论】:

  • 您确定-daystart 是您所需要的吗?尝试使用另一个-mmin-mtime 参数设置时间范围,例如-mmin +10 -mtime -1
  • @Murphy 这是一个很酷的建议。谢谢!我仍然想知道为什么它不适用于 daystart。
  • (旁白:这不是一个真正的 bash 问题;从 ash/dash/ksh/zsh/fish 开始 find 或完全不使用 shell 运行它(即 @ 987654332@).
  • ...另一边:-exec ls -lrt {} \; 表示您为找到的每个文件运行一次ls,这意味着它不能进行任何排序(-t 如果它只给了一个文件!)
  • @CharlesDuffy 没错,我对其他 shell 也有同样的问题。顺便说一句,我不介意 -exec ls -lrt {} \;部分是因为排序不是我的要求 - 但谢谢你提到它。

标签: shell unix find gnu-findutils


【解决方案1】:

-daystart 修改了-mtime-mmin 和相关谓词的含义,这些谓词基于相对于现在(默认)的时间进行操作;它本身不是谓词,因此除非您使用这些其他操作之一,否则它不会影响您的 find 命令的结果。

因此,如果您想过滤相对于当天开始的 mtime,则需要指定,如 -mtime -1after -daystart(而您的过滤器相对于当前时间应该是之前 -daystart):

find . -type f -mmin +10 -daystart -mtime -1 -exec ls -lrt {} +

请注意,我们指定 -mmin +10 before -daystart 使其相对于当前时间,但指定 -mtime -1 after -daystart 使相对于一天的开始。

注意+ 而不是; -- 如果你只为ls 的每个实例传递一个文件名,ls -t 没有任何意义,因为对大小为 1 的列表进行排序总是会得到完全相同的结果列表。请参阅BashFAQ #3,以讨论更健壮和可靠的方法来按时间对从 GNU find 返回的文件列表进行排序。

【讨论】:

  • 如果我使用 -mtime -1,find 将列出最后 24 小时的文件,但我从一天开始就需要它。
  • 这就是-mtime -1 在您同时指定-daystart 时所做的事情。使用-daystart 会改变-mtime 后续实例的含义(以及一般的-{a,c,m}{min,time} 谓词)..
  • 顺便说一句,如果-mmin +10 的目标是避免对仍在写入的文件进行操作,那么有更好的方法可以做到这一点——例如,如果你有一个 incron 工作,你可以立即在创建或修改文件的进程关闭其句柄后立即(但不是在此之前!)触发对 any 文件的操作。
  • @RanjanShetty,...我对这个答案进行了一些改进,希望使其适用性更加清晰。
  • 您的回答符合我的要求。非常感谢。 -mmin +10 的需要不是过滤当前正在写入的文件,我的工作有不同的要求。
【解决方案2】:

由于您需要在过去 10 分钟或 更少 内修改过的文件,因此您需要将 -10 传递给 -mtime 参数,而不是 +10

find . -maxdepth 1 -type f -daystart -mmin -10 -exec ls -lrt {} \;

查看此页面:

【讨论】:

  • 感谢您的回复。我正在寻找创建/修改时间超过 10 分钟但少于 daystart 的文件。