shell脚本如何确定文件是二进制还是文本?

有一种情况,我需要一个shellbash脚本来确定一个文件是否是二进制文件。 这里的问题是Linux环境没有可用的filegrep版本是从不支持-I busybox。 我发现一个perl方法(perl版本是旧的支持-e但不是-E)它的工作,但它很慢。 有没有人有更快的方法来确定文件是二进制的? TIA!

 #!/bin/sh is_text_file() { # grep -qI '.' "$1" ### busy box grep doesn't support perl -e 'exit((-B $ARGV[0])?1:0);' "$1" ### works but is slow } do_test_text_file_on_dir() { for f in "$1"/*; do [ -f "$f" ] || continue if is_text_file "$f"; then echo "$f" is not a binary file fi done } do_test_text_file_on_dir ~/testdir 

通过在Perl中完成所有工作,避免重复加载perl所花费的时间。

 #!/usr/bin/perl for (@ARGV) { stat($_) or warn("Can't stat \"$_\": $!\n"), next; -f _ && !-B _ or next; print("\"$_\" isn't a binary file\n"); } 

用法:

 do_test_text_file_on_dir ~/testdir/* 

注意: !-B _相当于-T _ ,空文件除外。