我从这里找到了这个练习
使用 grep 列出您的主目录中不到 10 小时前更改的文件,但忽略目录。
使用命令似乎微不足道find
,但是如何使用grep
命令查找在过去 10 小时内更改的文件?
谢谢!
好吧,这是一个可憎的,但这是一个练习,我很好奇。正则表达式可能太简单了,但它适用于我的测试用例。这里的“技巧”是我使用“stat”而不是“ls”。使用“stat”,您可以请求特定字段(包括上次修改日期)并格式化输出。在这里,我获取当前时间戳,返回 10 小时,然后通过 grep 以字符串形式、修改日期时间戳和文件名汇集格式化为模式的 stat:
sh-3.2$ date "+%s"
1373170496
sh-3.2$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1373170496-36000
1373134496
sh-3.2$ stat -f"%Sp %m %N" * | grep "^[\-].*13731[3-7][0-9][0-9][0-9][0-9].*$"
-rw-r--r-- 1373168941 fileAB
-rw-r--r-- 1373168944 fileAC
其中 fileAB 和 fileAC 是我为一些代表性数据而触及的两个空文件。匹配显示 stat 输出,手册页对此进行了更好的解释。
该问题取自Bash Guide for Beginners,第 4 章。正则表达式。这不是一个实际的问题,它显然是为了练习正则表达式,以一种有点扭曲的方式。此外,这本书托管在 Linux 文档项目的站点上,因此可以安全地假设在 Linux 中实现这一点,使用常用工具的 GNU 实现。
这是我的解决方案,使用grep
(一点点):
ls -algG --time-style=+%s | grep ^[^d] | awk -vlimit=$(date +%s -d '10 hours ago') '$4 > limit { print substr($0, index($0, $4) + length($4) + 1) }'
解释:
ls
包括隐藏文件 ( -a
),使用长格式 ( -l
),省略所有者和组信息 ( -g
, -G
),以及格式时间,就像解释一样date
,%s
表示自 1970-01-01 00:00:00 以来的秒数世界标准时间grep
行,有效地排除目录awk
,因为坦率地说,没有合理的方法来弯曲正则表达式以匹配代表“不到 10 小时前”的日期在现实世界中,我会这样解决这个问题,而不是使用正则表达式:
touch marker.touch -d '10 hours ago'
find . -newer marker.touch -maxdepth 1 -type f