62

ファイルがバイナリ ファイルかどうかを確認するにはどうすればよいですか?

たとえば、コンパイルされた c ファイル。

あるディレクトリからすべてのファイルを読み取りたいのですが、バイナリ ファイルを無視したいです。

4

13 に答える 13

69

使用ユーティリティfile、使用例:

 $ file /bin/bash
 /bin/bash: Mach-O universal binary with 2 architectures
 /bin/bash (for architecture x86_64):   Mach-O 64-bit executable x86_64
 /bin/bash (for architecture i386): Mach-O executable i386

 $ file /etc/passwd
 /etc/passwd: ASCII English text

 $ file code.c
 code.c: ASCII c program text

fileマニュアルページ

于 2013-05-26T14:51:14.397 に答える
15

バイナリファイルの除外から適応

find . -exec file {} \; | grep text | cut -d: -f1
于 2013-05-26T15:21:57.023 に答える
13

私が使う

! grep -qI . $path

私が見ることができる唯一の欠点は、空のファイルバイナリを考慮することですが、それが間違っているかどうかを判断するのは誰ですか?

于 2015-04-17T02:44:00.870 に答える
4
perl -E 'exit((-B $ARGV[0])?0:1);' file-to-test

「テストするファイル」がバイナリであるときはいつでもチェックするために使用できます。上記のコマンドは、バイナリ ファイルではコード 0 で終了します。それ以外の場合、終了コードは 1 になります。

テキスト ファイルのリバース チェックは、次のコマンドのようになります。

perl -E 'exit((-T $ARGV[0])?0:1);' file-to-test

同様に、「テストするファイル」がテキスト (バイナリではない) の場合、上記のコマンドはステータス 0 で終了します。

-Bおよび-Tコマンドを使用したチェックの詳細を参照してくださいperldoc -f -X

于 2013-09-09T09:06:00.910 に答える
3

-Tファイル テスト オペレータを使用してプレーン ファイルであることを確認した後、Perl の組み込みファイル テスト オペレータを使用し-fます。

$ perl -le 'for (@ARGV) { print if -f && -T }' \
    getwinsz.c a.out /etc/termcap /bin /bin/cat \
    /dev/tty /usr/share/zoneinfo/UTC /etc/motd
getwinsz.c
/etc/termcap
/etc/motd

そのセットの補足は次のとおりです。

$ perl -le 'for (@ARGV) { print unless -f && -T }' \
    getwinsz.c a.out /etc/termcap /bin /bin/cat \
    /dev/tty /usr/share/zoneinfo/UTC /etc/motd
a.out
/bin
/bin/cat
/dev/tty
/usr/share/zoneinfo/UTC
于 2013-06-18T22:42:02.473 に答える
0

でバイナリファイルを除外するのは一種の強引ですtr -d "[[:print:]\n\t]" < file | wc -cが、ヒューリスティックな推測でもありません。

find . -type f -maxdepth 1 -exec /bin/sh -c '
   for file in "$@"; do
      if [ $(LC_ALL=C LANG=C tr -d "[[:print:]\n\t]" < "$file" | wc -c) -gt 0 ]; then
         echo "${file} is no ASCII text file (UNIX)"
      else
         echo "${file} is ASCII text file (UNIX)"
      fi
   done
' _ '{}' +

ただし、次のブルート フォース アプローチを使用するgrep -a -m 1 $'[^[:print:]\t]' fileと、かなり高速に見えます。

find . -type f -maxdepth 1 -exec /bin/sh -c '
   tab="$(printf "\t")"
   for file in "$@"; do
      if LC_ALL=C LANG=C grep -a -m 1 "[^[:print:]${tab}]" "$file" 1>/dev/null 2>&1; then
         echo "${file} is no ASCII text file (UNIX)"
      else
         echo "${file} is ASCII text file (UNIX)"
      fi
   done
' _ '{}' + 
于 2014-02-21T13:01:53.947 に答える
0

grep

バイナリが印刷不可能な文字 (スペース、タブ、改行文字などの空白文字を除く) を含むファイルを意味すると仮定すると、これは機能する可能性があります (BSD と GNU の両方):

$ grep '[^[:print:][:blank:]]' file && echo Binary || echo Text

注: GNUは NULL 文字のみを含むファイルをテキストとして報告しますが、 grepBSD バージョンでは正しく動作します。

その他の例については、次を参照してください: How do I grep for all non-ASCII characters .

于 2018-04-12T22:04:24.333 に答える