【发布时间】:2018-06-29 09:08:41
【问题描述】:
我正在尝试搜索二进制文件列表以在 Mac 上找到一些关键字。
下面列出了所有匹配项,但它没有显示找到它的文件列表:
find . -type f -exec strings {} \;|grep "Bv9qtsZRgspQliITY4"
有什么诀窍吗?
【问题讨论】:
-
您还想打印匹配项,还是只打印文件的名称/路径?
我正在尝试搜索二进制文件列表以在 Mac 上找到一些关键字。
下面列出了所有匹配项,但它没有显示找到它的文件列表:
find . -type f -exec strings {} \;|grep "Bv9qtsZRgspQliITY4"
有什么诀窍吗?
【问题讨论】:
将-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 -arl . -e 'soloman' | tee | strings --print-file-name 在这种情况下,您可以重定向到字符串并在那里处理?
试试grep -rl "Bv9qtsZRgspQliITY4" .。
选项说明:
-r:递归搜索-l:不打印文件内容,只打印文件名。您可能希望使用-i 不区分大小写搜索。
您的想法的问题是您将strings 的输出通过管道传输到grep。文件名仅传递给strings,这意味着strings 之后的任何内容都不知道文件名。
【讨论】:
我不太确定可移植性,但如果您使用的是 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)。
-U 来指定一个二分搜索。所以strings 命令和相关的find 命令是多余的。
strings的输出和文件内容不一样,所以greping它不和greping文件一样, 二进制与否。
-U,我的意思是-a。
好吧,如果只是打印文件名,不要使用 find 而是使用 grep。
grep -ar . -e 'soloman' ./testo.txt:1:soloman
并保持简单。
如果您不想在输出中看到匹配的单词,只需添加 -l, --files-with-matches:
user@DESKTOP-RR909JI ~/projects/search
$ grep -arl . -e 'soloman'
./testo.txt
【讨论】:
你可以使用
# 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" ./
【讨论】:
strings 的东西。这可能行不通。