我需要建立一个列表,其中包含目录树中所有二进制文件的文件扩展名。
主要问题在于如何区分文本文件和二进制文件,其余部分应该很简单。
编辑:这是我得到的最接近的结果,有更好的想法吗?
find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g'
我需要建立一个列表,其中包含目录树中所有二进制文件的文件扩展名。
主要问题在于如何区分文本文件和二进制文件,其余部分应该很简单。
编辑:这是我得到的最接近的结果,有更好的想法吗?
find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g'
这里有一个方法可以找到二进制文件:
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'
。 - dukeofgaming这个 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用于测试二进制文件,它们是彼此的对立面*。
file
查看内容并猜测类型。不幸的是,它并没有提供简单的“二进制或文本”答案;它有一个复杂的输出,你必须解析其中的大量情况。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 类型。然后,你可以检查该 MIME 类型是否具有 text/
前缀。我猜这可能会非常有效。 - Michał Kosmulski没有确定的方法可以区分“文本”文件和“二进制”文件,这只能是猜测。
#!/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
grep
列出所有包含NULL字符的二进制文件:grep -Palr '\x00' .
awk
,然后通过使用uniq
或sort
来过滤重复项。grep -Palr '\x00' . | awk -F. '{if (length($NF) < 5) print $NF}' | sort -u
这是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 {}" \;
要查找所有非二进制文件,请将 &&
更改为 ||
。