如何检查文件是否是二进制文件并读取所有文件?

Ref*_*ael 44 unix shell binaryfiles

我怎么知道文件是否是二进制文件?

例如,编译的c文件.

我想从某个目录中读取所有文件,但我想忽略二进制文件.

Ada*_*ion 49

使用实用程序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
Run Code Online (Sandbox Code Playgroud)

file 手册页

  • @ 4dan - 也许是"--mime"?:) (11认同)
  • 考虑使用'file --mine'.对于二进制文件,它报告"... charset = binary",因此可以简单地为正则表达式"二进制$"grep. (5认同)
  • @4dan 对我有用:`file -bL --mime "$path" | grep -q '^文本'`。选项`-b` 从输出中删除文件名,`-L` 取消引用符号链接。 (3认同)

gon*_*aao 10

改编自二进制文件

find . -exec file {} \; | grep text | cut -d: -f1
Run Code Online (Sandbox Code Playgroud)

  • 如果文件名包含单词"text"怎么办?我现在使用grep".*:.*text" (2认同)

Alo*_*dal 10

我用

! grep -qI . $path
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一缺点就是它会考虑一个空的文件二进制文件,但是再次,谁决定这是不是错了?

  • Grep 用于空字符串(`''`),而不是任何单个字符(`'.'`):**`!fgrep -qI '' "$path"`**. 这样,空文件和仅包含换行标记(换行符)的文件将被视为文本。 (2认同)

ken*_*orb 5

BSD grep

这是使用BSDgrep(在 macOS/Unix 上)检查单个文件的简单解决方案:

grep -q "\x00" file && echo Binary || echo Text
Run Code Online (Sandbox Code Playgroud)

它基本上检查文件是否包含 NUL 字符。

使用此方法,要使用find实用程序递归读取所有非二进制文件,您可以执行以下操作:

find . -type f -exec sh -c 'grep -q "\x00" {} || cat {}' ";"
Run Code Online (Sandbox Code Playgroud)

或者甚至更简单地使用grep

grep -rv "\x00" .
Run Code Online (Sandbox Code Playgroud)

对于当前文件夹,请使用:

grep -v "\x00" *
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面的示例不适用于GNUgrep,但是有一个解决方法。

GNU grep

由于 GNUgrep忽略 NULL 字符,因此可以检查其他非 ASCII 字符,例如:

$ grep -P "[^\x00-\x7F]" file && echo Binary || echo Text
Run Code Online (Sandbox Code Playgroud)

注意:它不适用于仅包含 NULL 字符的文件。