如何在Unix中找到包含特定文本的最新文件?

时间:2017-06-09 17:15:54

标签: unix grep find

我有一个包含数千个文件的目录,其中许多文件包含我正在寻找的文字。我只能在一个目录中搜索。我需要在包含特定文本的目录中找到最近创建的文件,例如" check"。

我已尝试过grep,find和ls,但我可以找到包含该文本的文件列表,例如

 find . -type f -exec grep -l check {} +

或使用以下目录中的最新文件:

ls -t1 |  head -n 1

如何将两者合并以获取包含特定文本的最新文件?

3 个答案:

答案 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>是您要查找的路径。

分步

  1. Grep
    • -R递归搜索 并遵循符号链接。
    • -P PATTERN可以是perl正则表达式。
    • -l仅显示包含匹配项的文件名
  2. Xargs
    • xargs将对来自stat(grep的输出)的每一行输入运行STDIN
  3. Grep
    • -P允许PATTERN中的perl正则表达式。
    1. '(Change:|File:)'
      我们只需要stat中的文件名和修改时间。
  4. Sed

    • -r支持扩展的正则表达式

    1. s/^\s*//
      从每一行的开头删除所有空格。
    2. s/File:.*\s(.*)/\1/

      用组1 File:

    3. 的内容替换(.*),任何立即空格和`。
    4. s/'$//
      从以1结尾的行中删除单引号。

    5. s/Change:(.*)$/\1*/
      删除Change:,并在每行末尾添加一个*
  5. Tr
    • -d删除字符而不是替换字符。
    1. '\n'
      删除换行符
    2. '*' '\n'
      用换行符替换星号。
  6. 知道
    1. 像这样HH:MM:SS.MS DATE FILE
    2. 打印输出
  7. 排序
    • -u丢弃重复的行
      我们只希望每个文件出现一次-我们不在乎模式在文件中出现了多少次。
    • -n根据字符串数值进行比较
      我们正在比较时间戳。
    • -r反转比较结果
      因此,最新文件位于顶部。

我在这里使用*是因为用例中的文件名中都没有星号。您可以使用任何喜欢的字符,只要它不出现在任何文件名或stat的输出中即可。