Linux 递归查找比给定时间更新的所有文件
给定时间:Linux 递归查找比给定时间更新的所有文件,linux,bash,Linux,Bash,给定时间: ⚡ date -ur 1312603983 Sat 6 Aug 2011 04:13:03 UTC 我正在寻找一个bash-one系列,列出所有更新的文件。比较时应考虑时区 差不多 find . --newer 1312603983 但是使用时间而不是文件。这有点迂回,因为touch不需要原始的time\t值,但它应该在脚本中非常安全地完成任务。(MacOS X中有-r到日期的选项;我没有仔细检查GNU。)可以通过直接在touch命令行中写入命令替换来避免“time”变量 ti
⚡ date -ur 1312603983
Sat 6 Aug 2011 04:13:03 UTC
我正在寻找一个bash-one系列,列出所有更新的文件。比较时应考虑时区
差不多
find . --newer 1312603983
但是使用时间而不是文件。这有点迂回,因为
touch
不需要原始的time\t
值,但它应该在脚本中非常安全地完成任务。(MacOS X中有-r
到日期的选项;我没有仔细检查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
也可以在不使用标记文件的情况下执行此操作
到目前为止的%s格式为自历元起的秒数。find的-mmin标志以分钟为单位获取一个参数,因此将秒数差除以60。年龄前的“-”表示查找上次修改时间小于年龄的文件
time=1312603983
now=$(date +'%s')
((age = (now - time) / 60))
find . -type f -mmin -$age
对于较新版本的gnu find,您可以使用-newermt,这使它变得微不足道。您可以找到在最后一天创建/修改的每个文件,请使用以下示例:
find /directory -newermt $(date +%Y-%m-%d -d '1 day ago') -type f -print
要查找上周的所有内容,请使用“1周前”或“7天前”
你想要什么都行,所以还有另一种方法(而且在某种程度上是可移植的)_
(python <<EOF
import fnmatch
import os
import os.path as path
import time
matches = []
def find(dirname=None, newerThan=3*24*3600, olderThan=None):
for root, dirnames, filenames in os.walk(dirname or '.'):
for filename in fnmatch.filter(filenames, '*'):
filepath = os.path.join(root, filename)
matches.append(path)
ts_now = time.time()
newer = ts_now - path.getmtime(filepath) < newerThan
older = ts_now - path.getmtime(filepath) > newerThan
if newerThan and newer or olderThan and older: print filepath
for dirname in dirnames:
if dirname not in ['.', '..']:
print 'dir:', dirname
find(dirname)
find('.')
EOF
) | xargs -I '{}' echo found file modified within 3 days '{}'
(python也许有人可以使用它。查找在特定时间范围内递归修改的所有文件,只需运行:
find . -type f -newermt "2013-06-01" \! -newermt "2013-06-20"
给定unix时间戳(自纪元起的秒数)149450000
,请执行以下操作:
find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)"
要将这些文件grep为“foo”:
假设是现代版本,find-newermt
功能强大:
find -newermt '10 minutes ago' ## other units work too, see `Date input formats`
或者,如果要指定(从开始的秒数):
作为参考,-newermt
未直接列在查找手册页中。相反,它显示为-newerXY
,其中XY
是mt
的占位符。其他替换是合法的,但不适用于此解决方案
从人工查找-newerXY
:
时间规范被解释为GNU date的-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 '@'
date-d
(和find-newermt
)参数非常灵活,但文档不清楚。这里有一个来源似乎很有道理:遗憾的是newerXY
是一个相对较新的扩展,默认情况下不可用,例如在CentOS 5.8中,您不需要date命令,因为-newermt的参数被视为迄今为止的-d
参数。在OSX Mountain Lion上(手册页表示2007 BSD?),似乎date
要求格式在末尾,而-d
选项实际上是-v
选项,因此上面的命令类似于find/directory-newermt$(date-v-1d+%Y-%m-%d)-输入f-print
通过测试,我发现-newermt实际上是“相同或更新”的意思,而不是“更新”这个词的意思:echo hello>/foo.txt;find-maxdepth 1-name foo.txt-newermt@$(stat-c%Y foo.txt)
返回/foo.txt
,而echo hello>/foo.txt;find-maxdepth 1-name foo.txt-newermt@$(($(stat-c%Y foo.txt)+1))
不返回任何内容。这是GNU findutils 4.4.2中的find
。事实上,您不需要$(日期…)
part.-newerXt
接受日期
命令中-d
之后的任何内容,因此-newermt“1天前”
工作得很好。这是一个很好的答案,需要进行更多的投票。不过有一条注释。日期格式参数应该是:find.-type f-newermt“$(date-d@149500000)+“%Y-%m-%d%H:%m:%S'”并在MacOSXNice上查找。-f-newermt类型“$(日期-r 149500000)+“%Y-%m-%d%H:%m:%S'”!我使用-not
来否定-newermt
:查找。-f-not-newermt类型“2017-10-01”
@Stefan如果在find命令中省略逻辑“NOT would ne”,会发生什么情况?还请记住,您可以将输出重定向到文件以供以后使用,例如find.-type f-newermt“2013-06-01”\!-newermt“2013-06-20”>output.txt
我只想记住如何查找比另一个文件更新的文件-查找。-键入f-更新的文件
正是我想要的。我正在查找陷阱做什么?@Stewart:第一个陷阱确保如果脚本退出或用HUP、INT、QUIT、PIPE或TERM信号发出信号,临时文件将被删除,并且e脚本以状态1退出(状态为“未成功”,因此为“失败”)。第二个陷阱确保取消原始的“退出时陷阱”,以便脚本成功退出。第一个陷阱不会尝试捕获所有可能的信号;它只捕获最有可能使用的信号。某些信号(终止、停止)一点也抓不到。@JonathanLeffler那么后面的数字就是信号ID吗?@Stewart:是的;如果你愿意,你可以用HUP这样的名字,而且不需要为古老的贝壳编写程序。当我学习时,名字不是一个选项,所以我不使用它们。此外,数字更紧凑,我经常在s中键入trap
命令创建临时文件的地狱脚本。当然,这主要是懒惰,而不是真正可以衡量的时间节省。我从来没有费心检查我当前使用的所有shell是否都支持名称,因为它们都支持数字。0
的名称是EXIT。您还可以执行类似操作:find-newermt'4pm day'
find -newermt @1568670245
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 '@'