【问题标题】:Shell command to list file names where the matching is found用于列出找到匹配项的文件名的 Shell 命令
【发布时间】:2018-06-29 09:08:41
【问题描述】:

我正在尝试搜索二进制文件列表以在 Mac 上找到一些关键字。

下面列出了所有匹配项,但它没有显示找到它的文件列表:

find . -type f -exec strings {} \;|grep "Bv9qtsZRgspQliITY4"

有什么诀窍吗?

【问题讨论】:

  • 您还想打印匹配项,还是只打印文件的名称/路径?

标签: shell grep pipe


【解决方案1】:

-exec 与一个小“脚本”一起使用:

find . -type f \
       -exec sh -c 'strings "$1" | grep -q "Bv9qtsZRgspQliITY4"' -- {} \; \
       -print

上面将打印所有匹配文件的路径。如果您还想打印匹配项,可以使用:

find . -type f \
       -exec sh -c 'strings "$1" | grep "Bv9qtsZRgspQliITY4"' -- {} \; \
       -print

然而,这将打印匹配的路径之后。如果这不是可取的,那么您可以使用:

find . -type f \
       -print \
       -exec sh -c 'strings "$1" | grep "Bv9qtsZRgspQliITY4"' -- {} \;

另一方面,这将打印 所有 路径,甚至是不匹配的路径。要打印匹配的路径及其匹配:

find . -type f \
       -exec sh -c 'strings "$1" | grep -q "Bv9qtsZRgspQliITY4"' -- {} \; \
       -print \
       -exec grep "Bv9qtsZRgspQliITY4" {} \;

这将在匹配的文件上运行两次grep,这会使其变慢。如果这是一个问题,则可以将匹配项存储在变量中,如果有任何路径,则首先打印然后匹配项。这留给读者作为练习。*

* 让我知道我是否应该在此处发布。

【讨论】:

  • 我测试过这个,但是没有显示文件的内容。
  • 我认为用户想要两个东西,文件名和打印的字符串下方。在那种情况下,grep 已经这样做了。
  • 没错,这个呢:$ grep -arl . -e 'soloman' | tee | strings --print-file-name 在这种情况下,您可以重定向到字符串并在那里处理?
【解决方案2】:

试试grep -rl "Bv9qtsZRgspQliITY4" .

选项说明:

  • -r:递归搜索
  • -l:不打印文件内容,只打印文件名。

您可能希望使用-i 不区分大小写搜索。

您的想法的问题是您将strings 的输出通过管道传输到grep。文件名仅传递给strings,这意味着strings 之后的任何内容都不知道文件名。

【讨论】:

    【解决方案3】:

    我不太确定可移植性,但如果您使用的是 GNU 版本的 grep,那么您可以使用 --files-with-matches

    -l, --files-with-matches  print only names of FILEs containing matches
    

    然后你可以使用这样的东西:

    grep --recursive --files-with-matches "Bv9qtsZRgspQliITY4" *
    

    【讨论】:

    • 你错过了整个strings 的东西。这可能行不通。
    • 仅供参考,-l 是可移植的 (POSIX),但 --files-with-matches 不是 (GNU)。
    • GNU grep 将搜索二进制文件。如果你想明确一点,你可以传递-U 来指定一个二分搜索。所以strings 命令和相关的find 命令是多余的。
    • 但是strings的输出和文件内容不一样,所以greping它greping文件一样, 二进制与否。
    • 我同意,但 OP 只想查找文件名,因此差异不会影响输出。之前我也说过-U,我的意思是-a
    【解决方案4】:

    好吧,如果只是打印文件名,不要使用 find 而是使用 grep。

    grep -ar . -e 'soloman' ./testo.txt:1:soloman
    
    • -a : 在二进制文件中搜索
    • -r : 递归

    并保持简单。

    如果您不想在输出中看到匹配的单词,只需添加 -l, --files-with-matches:

    user@DESKTOP-RR909JI ~/projects/search
    $ grep -arl . -e 'soloman'
    ./testo.txt
    

    【讨论】:

      【解决方案5】:

      你可以使用

      # this will list all the files containing given text in current directory
      # i to ignore case
      # l to list files with matches
      # R read and process all files in that directory, recursively, following all symbolic links
      grep -iRl "your-text-to-find" ./
      
      # for case sensitive search
      grep -Rl "your-text-to-find" ./
      

      【讨论】:

      • 添加 -i 可能会导致用户搜索时出现不正确的字符串。
      • @nandal 你错过了整个strings 的东西。这可能行不通。
      • @John,谢谢,仅供参考,这会打印出文件名,但没有匹配项。
      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多