如何列出目录树中的所有二进制文件扩展名?

8

我需要建立一个列表,其中包含目录树中所有二进制文件的文件扩展名。

主要问题在于如何区分文本文件和二进制文件,其余部分应该很简单。

编辑:这是我得到的最接近的结果,有更好的想法吗?

find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g'

UTF-8编码的文本文件怎么样?将其视为二进制文件吗? - PasteBT
按照惯例,可执行二进制文件没有扩展名。 - jordanm
@jordanm 除了那个星号和加粗的颜色之外,鸭子 :) - Kaz
2
存在空字节是一个相当不错的启发式方法,尽管它可能会错过一些小型或特殊的二进制文件。 - tripleee
如何在目录中查找二进制文件(Linux)? - phuclv
6个回答

13

这里有一个方法可以找到二进制文件:

grep -r -m 1 "^"  <Your Root> | grep "^Binary file"
-m 1 参数可以让 grep 命令在匹配到第一个结果后就停止读取文件。

2
比我找到的解决方案更干净和更快,这是我使用的最终命令 grep -r -m 1 "^" apps|grep "^Binary file"|sed -r 's:^Binary\sfile\s(.*)\smatches:\1:g' - dukeofgaming

4

这个 Perl 一行代码对我很有帮助,而且速度也相当快:

find . -type f -exec perl -MFile::Basename -e 'print (-T $_ ? "" : (fileparse ($_, qr/\.[^.]*/))[2] . "\n" ) for @ARGV' {} + | sort | uniq

以下是如何查找当前文件夹中的所有二进制文件:

find . -type f -exec perl -e 'print (-B $_ ? "$_\n" : "" ) for @ARGV' {} +

-T用于测试文本文件,-B用于测试二进制文件,它们是彼此的对立面*。

*Perl文件测试文档


2
在Linux上,二进制文件和文本文件没有区别。实用程序file查看内容并猜测类型。不幸的是,它并没有提供简单的“二进制或文本”答案;它有一个复杂的输出,你必须解析其中的大量情况。
一种方法是读取文件的一些固定大小的前缀,比如说256字节,然后应用一些启发式算法。例如,所有字节值是否在0x0到0x7F之间,避免控制字符,除了常见空白字符?这表明ASCII吗?如果有0x80到0xFF的字节,整个缓冲区(除了最后可能被截断的一个代码)是否解码为有效的UTF-8?等等。
一个想法可能是巧妙地利用检测二进制文件的实用工具,比如GNU diff
$ diff -r /bin/ls <(echo foo)
Binary files /bin/ls and /dev/fd/63 differ

没有进程替换,仍然可以工作:

$ diff -r /bin/ls /dev/null
Binary files /bin/ls and /dev/null differ

现在只需对其输出进行grep并查找单词Binary

问题是diff对二进制文件的启发式是否适用于您的目的。


2
你可以尝试使用 file -i 命令,它会输出文件格式的 MIME 类型。然后,你可以检查该 MIME 类型是否具有 text/ 前缀。我猜这可能会非常有效。 - Michał Kosmulski
好知道,谢谢!我正在浏览 man 页面,寻找更紧凑的输出空间,但没有发现这个选项。 - Kaz

1

没有确定的方法可以区分“文本”文件和“二进制”文件,这只能是猜测。

#!/bin/bash
guess=`echo \`head -c 4096 $1 | strings -a -n 1 | wc -c \`  '* 1.05 /'  \`head -c 4096 $1 |  wc -c \` | bc `;
if [ $guess -eq 1 ] ; then
    echo $1 "is text file"
    exit 0
else
    echo $1 "is binary file"
    exit 1
fi

1
这是一个简单的命令,可以使用GNU grep列出所有包含NULL字符的二进制文件:
grep -Palr '\x00' .

为了打印文件扩展名少于5个字符,我们可以使用awk,然后通过使用uniqsort来过滤重复项。
所以全部内容应该是这样的:
grep -Palr '\x00' . | awk -F. '{if (length($NF) < 5) print $NF}' | sort -u

0

这是Python中的一行代码,用于检查文件是否为二进制文件:

b"\x00" in open("/etc/hosts", "rb").read()

在shell中使用递归查找,参见以下示例:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())'
find . -type f -exec bash -c "python -c '$IS_BINARY' {} && echo {}" \;

要查找所有非二进制文件,请将 && 更改为 ||


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接