我需要构建一个位于目录树中的二进制文件的所有文件扩展名列表。
主要问题需要是如何区分文本文件和二进制文件,其余的应该是蛋糕。
编辑:这是我最接近的,有更好的想法吗?
find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g'
答案 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是对二进制文件的测试,它们是彼此的对立*。
答案 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
,然后使用uniq
或sort
过滤掉重复项。
所以这一切应该是这样的:
grep -Palr '\x00' . | awk -F. '{if (length($NF) < 5) print $NF}' | sort -u