Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 递归查找比给定时间更新的所有文件_Linux_Bash - Fatal编程技术网

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 '@'