给定一个time_t:
⚡ date -ur 1312603983
Sat 6 Aug 2011 04:13:03 UTC
我正在寻找一个bash单线列出所有较新的文件。比较应考虑时区。
就像是
find . --newer 1312603983
但是使用time_t而不是文件。
Answers:
这有点circuit回,因为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
trap
办?
trap
经常在创建临时文件的shell脚本中键入命令。当然,这主要是懒惰,不是真正可测量的节省时间。我从来没有费心检查我当前使用的所有shell是否都支持名称,因为它们都支持数字。的名称0
是EXIT。
您可以找到每个文件在过去一天创建/修改的内容,请使用以下示例:
find /directory -newermt $(date +%Y-%m-%d -d '1 day ago') -type f -print
要查找上周的所有内容,请使用“ 1周前”或“ 7天前”
newerXY
是,这是一个相对较新的扩展,默认情况下不可用,例如在CentOS 5.8
-d
date的参数。
date
要求格式必须在最后,并且该-d
选项实际上是该-v
选项,因此上面的命令看起来像find /directory -newermt $(date -v-1d +%Y-%m-%d) -type f -print
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 ))
不返回任何东西。这是find
来自GNU findutils 4.4.2。
$(date ...)
部分。-newerXt
接受任何涉及后-d
的date
命令,因此-newermt '1 day ago'
很好地工作。
也许有人可以使用它。递归查找在特定时间范围内修改的所有文件,只需运行:
find . -type f -newermt "2013-06-01" \! -newermt "2013-06-20"
-not
否定-newermt
: find . -type f -not -newermt "2017-10-01"
find . -type f -newermt "2013-06-01" \! -newermt "2013-06-20" > output.txt
给定的unix时间戳记(自纪元以来的秒数)1494500000
,请执行以下操作:
find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)"
要将这些文件grep表示为“ foo”:
find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)" -exec grep -H 'foo' '{}' \;
您也可以在没有标记文件的情况下执行此操作。
迄今为止的%s格式是自该时期以来的秒数。find的-mmin标志以分钟为单位接受参数,因此将秒数之差除以60。age前面的“-”表示查找最后修改小于age的文件。
time=1312603983
now=$(date +'%s')
((age = (now - time) / 60))
find . -type f -mmin -$age
对于较新版本的gnu find,您可以使用-newermt,这使它变得微不足道。
假设发布了新版本,find -newermt
功能强大:
find -newermt '10 minutes ago' ## other units work too, see `Date input formats`
或者,如果您要指定a time_t
(距离epoch的秒数):
find -newermt @1568670245
仅供参考,-newermt
未在手册页中直接列出以供查找。而是显示为-newerXY
,其中XY
占位符为mt
。其他替代产品是合法的,但不适用于此解决方案。
来自man find -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
)参数是相当灵活,但文档是模糊的。这似乎是一个要点:日期输入格式
find -newermt '4:00pm yesterday'
因此,还有另一种方式(并且在某种程度上可以移植_
(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 '{}'
find . -type f -newer <file>
正是我要寻找的东西