我有一个包含数千个文件的目录,其中许多文件包含我正在寻找的文字。我只能在一个目录中搜索。我需要在包含特定文本的目录中找到最近创建的文件,例如" check"。
我已尝试过grep,find和ls,但我可以找到包含该文本的文件列表,例如
find . -type f -exec grep -l check {} +
或使用以下目录中的最新文件:
ls -t1 | head -n 1
如何将两者合并以获取包含特定文本的最新文件?
答案 0 :(得分:1)
我调整了我的初始命令以获得所需的结果。我在这里张贴以供将来搜索:
find . -type f | xargs grep -l "text to find" | xargs ls -rt | tail -1
答案 1 :(得分:0)
这是一种简单的方法:
find . -type f -exec grep -l check {} + | xargs ls -latr
答案 2 :(得分:0)
这是一种不错的方法:
grep -Pl '<PATTERN>' <DIR> -R \
| xargs stat \
| grep '(Change:|File:)' -P \
| sed -r 's/^\s*//; s/File:.*\s(.*)`/\1/; '"s/'$//;"'s/Change:(.*)$/\1*/' \
| tr -d '\n' \
| tr '*' '\n' \
| awk '{printf "%s %s %s\n", $3, $2, $1; }' \
| sort -unr
<PATTERN>
是您要查找的文本,<DIR>
是您要查找的路径。
-R
递归搜索 并遵循符号链接。-P
PATTERN
可以是perl正则表达式。-l
仅显示包含匹配项的文件名stat
(grep的输出)的每一行输入运行STDIN
。-P
允许PATTERN
中的perl正则表达式。
'(Change:|File:)'
stat
中的文件名和修改时间。Sed
-r
支持扩展的正则表达式
s/^\s*//
s/File:.*\s(.*)/\1/
用组1 File:
(.*)
,任何立即空格和`。
s/'$//
从以1结尾的行中删除单引号。
s/Change:(.*)$/\1*/删除
Change:
,并在每行末尾添加一个*
†。-d
删除字符而不是替换字符。
'\n'
'*' '\n'
HH:MM:SS.MS DATE FILE
-u
丢弃重复的行-n
根据字符串数值进行比较-r
反转比较结果 †我在这里使用*
是因为用例中的文件名中都没有星号。您可以使用任何喜欢的字符,只要它不出现在任何文件名或stat
的输出中即可。