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

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

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

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

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

Solutions Collecting From Web of "如何列出目录树中的所有二进制文件扩展名?"

这里有一个技巧来找到二进制文件:

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

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

这个单一的线程为我工作,这也是相当快的:

 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文件测试文档

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

没有办法区分“文本”文件和“二进制”文件,这是猜测的工作。

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

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

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

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

 grep -Palr '\x00' . 

要打印短于5个字符的文件扩展名,我们可以使用awk ,然后使用uniqsort进行重复筛选。

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

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