2012-03-21 145 views
8

我需要建立目录树中二进制文件的所有文件扩展名列表。如何列出目录树中的所有二进制文件扩展名?

主要问题将需要如何区分一个文本文件和二进制文件,其余的应该是蛋糕。

编辑:这是我得到的最接近的,有更好的点子吗?

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

如何UTF-8编码的文本文件?把它算作一个二进制文件? – PasteBT 2012-03-21 21:46:05

+0

按照惯例,可执行二进制文件没有扩展名。 – jordanm 2012-03-21 22:04:13

+0

@jordanm除了那颗明星之外,还有一个大胆的颜色。 *鸭* :) – Kaz 2012-03-22 01:23:12

回答

11

这里有一个窍门,找到二进制文件:

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

的-m 1使得grep的未读出所有文件。

+2

清理和比我找到的解决方案更快,这里是我使用'grep -r -m 1“^”apps | grep“^ Binary file”| sed -r':^ Binary \ sfile \ s(。 *)\ smatches:\ 1:g'' – dukeofgaming 2012-03-22 15:31:53

+0

一个简单的管道到'awk'{print $ 3}''更简单... – 2014-10-28 20:53:32

2

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的启发式二进制文件是否适用于您的目的。

+2

您可以尝试使用'file -i',这会导致它将文件格式输出为MIME类型。然后,您可以检查MIME类型是否具有“text /”前缀。我想这可能工作得很好。 – 2012-03-21 21:53:14

+0

很高兴知道,谢谢!我正在浏览手册页,从'file'搜索更加精简的输出空间,但没有发现这一点。 – Kaz 2012-03-21 21:57:37

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 
4

这佩尔利一个班轮工作对我来说,这也是相当快:

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

0

这里是一个班轮在Python检查,如果是二进制文件:

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

查找壳递归地使用它,见下面的例子:

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

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

0

下面是简单的命令列出使用GNU grep所有二进制文件(包括NULL character):

grep -Palr '\x00' . 

要打印的文件扩展名少于5个字,我们可以使用awk,然后使用过滤掉重复要么是uniq要么是sort

所以都在一起应该是这样的:

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