2

我从这里找到了这个练习

使用 grep 列出您的主目录中不到 10 小时前更改的文件,但忽略目录。

使用命令似乎微不足道find,但是如何使用grep命令查找在过去 10 小时内更改的文件?

谢谢!

4

2 回答 2

3

好吧,这是一个可憎的,但这是一个练习,我很好奇。正则表达式可能太简单了,但它适用于我的测试用例。这里的“技巧”是我使用“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 输出,手册页对此进行了更好的解释。

于 2013-07-07T04:45:39.827 回答
2

该问题取自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 以来的秒数世界标准时间
  • 匹配以非字母“d”开头的grep行,有效地排除目录
  • 我们将它传递给awk,因为坦率地说,没有合理的方法来弯曲正则表达式以匹配代表“不到 10 小时前”的日期

在现实世界中,我会这样解决这个问题,而不是使用正则表达式:

touch marker.touch -d '10 hours ago'
find . -newer marker.touch -maxdepth 1 -type f
于 2013-07-07T05:17:08.010 回答