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

时间:2012-03-21 21:27:31

标签: linux bash filesystems

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

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

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

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

6 个答案:

答案 0 :(得分:11)

这是找到二进制文件的技巧:

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

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

答案 1 :(得分: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

答案 2 :(得分: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的二进制文件启发式是否适用于您的目的。

答案 3 :(得分: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 :(得分: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 {}" \;

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

答案 5 :(得分:0)

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

grep -Palr '\x00' .

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

所以这一切应该是这样的:

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