递归查找比给定时间更新的所有文件

wha*_*ave 63 linux bash

给定time_t:

? date -ur 1312603983
Sat  6 Aug 2011 04:13:03 UTC
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个bash one-liner,它列出了所有较新的文件.比较应考虑时区.

就像是

find . --newer 1312603983
Run Code Online (Sandbox Code Playgroud)

但是使用time_t而不是文件.

小智 140

您可以找到在最后一天创建/修改的每个文件,使用此示例:

find /directory -newermt $(date +%Y-%m-%d -d '1 day ago') -type f -print
Run Code Online (Sandbox Code Playgroud)

要查找上周的所有内容,请使用"1周前"或"7天前"任何您想要的内容

  • 您不需要date命令,因为-newermt的参数被视为日期的`-d`参数. (7认同)
  • 实际上,你不需要`$(date ...)`部分.`-newerXt`在'date`命令中接受`-d`之后的任何内容,所以`-newermt'1天前''很好用. (7认同)
  • 在OSX Mountain Lion上(man page指示2007 BSD?),似乎`date`要求格式在最后,`-d`选项实际上是`-v`选项,所以上面的命令看起来比如`find/directory -newermt $(date -v-1d +%Y-%m-%d)-type f -print` (6认同)
  • 可悲的是,`newerXY`是一个相对较新的扩展,默认情况下不可用,例如在CentOS 5.8中 (4认同)

Ste*_*abo 31

也许有人可以使用它.查找在递归的特定时间范围内修改的所有文件,只需运行:

find . -type f -newermt "2013-06-01" \! -newermt "2013-06-20"
Run Code Online (Sandbox Code Playgroud)

  • 真好!我用`-not`否定`-newermt`:`find。-f -not -newermt“ 2017-10-01”` (2认同)

Jon*_*ler 17

这有点迂回,因为touch它没有采用原始time_t值,但它应该在脚本中非常安全地完成工作.(MacOS X中存在-r选项date;我没有仔细检查过GNU.)通过在touch命令行中直接编写命令替换,可以避免'time'变量.

time=$(date -r 1312603983 '+%Y%m%d%H%M.%S')
marker=/tmp/marker.$$
trap "rm -f $marker; exit 1" 0 1 2 3 13 15
touch -t $time $marker
find . -type f -newer $marker
rm -f $marker
trap 0
Run Code Online (Sandbox Code Playgroud)

  • 我只是想记住如何找到比另一个文件更新的文件 - `find . -type f -newer <file>` 正是我想要的 (3认同)
  • @Stewart:第一个陷阱确保如果脚本退出或用HUP,INT,QUIT,PIPE或TERM信号发出信号,则删除临时文件,脚本以状态1退出(这是'不成功',因此'失败').第二个陷阱确保取消原始的"退出时的陷阱",以便脚本成功退出.第一个陷阱并不试图捕获所有可能的信号; 它只抓住了最有可能使用的那些.根本无法捕获某些信号(KILL,STOP). (3认同)
  • @Stewart:是的; 如果您愿意,可以使用HUP之类的名称,而不需要为古老的shell编程.当我了解到,名字不是一个选项,所以我不使用它们.此外,数字更紧凑,我经常在创建临时文件的shell脚本中键入`trap`命令.当然,这主要是懒惰,而不是真正可测量的节省时间.我从来没有费心去检查我目前使用的所有shell是否支持名称,因为它们都支持这些数字."0"的名称是EXIT. (2认同)

nob*_*bar 12

假设一个现代版本,find -newermt是强大的:

find -newermt '10 minutes ago' ## other units work too, see `Date input formats`
Run Code Online (Sandbox Code Playgroud)

或者,如果您想指定一个time_t(自epoch以来的秒数):

find -newermt @1568670245
Run Code Online (Sandbox Code Playgroud)

供参考,-newermt没有直接列在手册页中供查找。相反,它显示为-newerXY,其中XY是 的占位符mt。其他替换是合法的,但不适用于此解决方案。

来自man find -newerXY

时间规范被解释为 GNU 日期的 -d 选项的参数。

因此,以下等效于初始示例:

find -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d '10 minutes ago')" ## long form using 'date'
find -newermt "@$(date +%s -d '10 minutes ago')" ## short form using 'date' -- notice '@'
Run Code Online (Sandbox Code Playgroud)

date -d(和find -newermt)参数是相当灵活,但文档是模糊的。这是一个似乎很重要的来源:日期输入格式

  • 您还可以执行以下操作:“find -newermt '4:00pm昨天'” (2认同)

rsa*_*den 10

给定unix时间戳(自纪元以来的秒数)1494500000,执行:

find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)"
Run Code Online (Sandbox Code Playgroud)

要为"foo"grep这些文件:

find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)" -exec grep -H 'foo' '{}' \;
Run Code Online (Sandbox Code Playgroud)


Dan*_*och 5

您也可以在没有标记文件的情况下执行此操作

迄今为止的%s格式是自纪元以来的秒数.find的-mmin标志以分钟为单位取一个参数,因此将差值除以秒数.并且年龄前面的" - "表示查找最后修改小于年龄的文件.

time=1312603983
now=$(date +'%s')
((age = (now - time) / 60))
find . -type f -mmin -$age
Run Code Online (Sandbox Code Playgroud)

使用更新版本的gnu find,你可以使用-newermt,这使得它变得微不足道.