【问题标题】:How to list all binary file extensions within a directory tree?如何列出目录树中的所有二进制文件扩展名?
【发布时间】:2012-03-21 21:27:31
【问题描述】:

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

主要问题是如何区分文本文件和二进制文件,剩下的应该是小菜一碟了。

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

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

【问题讨论】:

  • UTF-8 编码的文本文件怎么样?算作二进制文件吗?
  • 按照惯例,可执行二进制文件没有扩展名。
  • @jordanm 除了那个明星的东西,而且颜色很大胆。 *鸭子* :)
  • 空字节的存在是一种很好的启发式方法,尽管它可能会遗漏一些小的或特殊的二进制文件。

标签: linux bash filesystems


【解决方案1】:

以下是查找二进制文件的技巧:

grep -r -m 1 "^"  <Your Root> | grep "^Binary file"

-m 1 使 grep 不读取所有文件。

【讨论】:

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

这个perly one-liner对我有用,它也很快:

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 file tests doc

【讨论】:

    【解决方案3】:

    Linux 上的二进制文件和文本文件没有区别。 file 实用程序查看内容并进行猜测。不幸的是,这并没有多大帮助,因为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 对二进制文件的启发式是否适用于您的目的。

    【讨论】:

    • 您可以尝试使用file -i,这会导致它以mime-type输出文件格式。然后,您可以检查 mime 类型是否具有 text/ 前缀。我想这可能会很好。
    • 很高兴知道,谢谢!我正在浏览手册页以寻找来自 file 的更简洁的输出空间,但没有发现。
    【解决方案4】:

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

    #!/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
    

    【讨论】:

      【解决方案5】:

      这里是 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 {}" \;
      

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

      【讨论】:

        【解决方案6】:

        这是使用 GNU grep 列出所有二进制文件(由 NULL character 组成)的简单命令:

        grep -Palr '\x00' .
        

        要打印小于 5 个字符的文件扩展名,我们可以使用 awk,然后使用 uniqsort 过滤掉重复项。

        所以所有的东西应该是这样的:

        grep -Palr '\x00' . | awk -F. '{if (length($NF) < 5) print $NF}' | sort -u
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          • 2012-02-24
          • 2018-04-27
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          • 2014-08-19
          相关资源
          最近更新 更多