Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
Regex 使用grep列出10小时前更改的目录中的文件_Regex_Bash_Grep - Fatal编程技术网

Regex 使用grep列出10小时前更改的目录中的文件

Regex 使用grep列出10小时前更改的目录中的文件,regex,bash,grep,Regex,Bash,Grep,这个练习是我从 使用grep在主目录中列出10小时前更改过的文件,但不包括目录 使用find命令似乎很简单,但如何使用grep命令查找在过去10小时内更改的文件 谢谢 好吧,这是一种讨厌的行为,但这是一种锻炼,我很好奇。正则表达式可能太简单了,但它在我的测试用例中工作。这里的“诀窍”是我用的是“stat”而不是“ls”。使用“stat”,您可以请求特定字段(包括上次修改的日期)并格式化输出。在这里,我获取当前时间戳,返回10小时,然后通过grep将stat格式化为字符串形式的模式,修改日期时间戳

这个练习是我从

使用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是两个空文件,我接触了它们以获取一些代表性数据。匹配显示统计输出,手册页对此有更好的解释。

问题来自《初学者Bash指南》第4章。正则表达式。这不是一个实际的问题,很明显,这是为了以一种有点扭曲的方式使用正则表达式。此外,这本书托管在Linux文档项目的站点上,因此可以安全地假设使用常用工具的GNU实现在Linux中实现这一点

下面是我的解决方案,使用
grep
(稍微):

说明:

  • ls
    选项用于列出所有文件,包括隐藏文件(
    -a
    ),使用长格式(
    -l
    ),省略所有者和组信息(
    -g
    -g
    ),并将时间格式化为由
    日期解释的时间,
    %s
    表示自1970-01-01 00:00 UTC以来的秒数
  • grep
    匹配以字母“d”以外的其他字母开头的行,实际上排除了目录
  • 我们将这一点传递给
    awk
    ,因为坦率地说,没有合理的方法来弯曲正则表达式以匹配表示“不到10小时前”的日期
在现实世界中,我会像这样解决这个问题,而不是使用正则表达式:

touch marker.touch -d '10 hours ago'
find . -newer marker.touch -maxdepth 1 -type f

你。。。不会。使用
find
。其目的可能是通过管道将
ls-l
(或类似)的输出传输到
grep
。顺便说一句,这是一种糟糕的做法:你建议改为
find
。对于熟悉Unix实用程序来说,这可能是一个很好的教育练习,但在“真实”脚本中解析
ls
的输出并不是一个好主意,因为类Unix系统通常对合法文件名没有什么限制。@ruakh即使我将输出传输到grep,我仍然不知道如何处理时间戳。这个练习有缺陷。这就像是在问:“我如何使用grep来了解玻利维亚的更多信息?”你可以,但你不应该。@codenob:呃,说得对。我假设有一个
ls
的选项,可以用某种形式显示时间戳,但通过查看
man ls
info ls
(和
man date
info date
),我没有看到。
touch marker.touch -d '10 hours ago'
find . -newer marker.touch -maxdepth 1 -type f