如何检查文件在Linux shell中是否只包含零?

vit*_*aut 12 linux shell file

如何'\0'使用shell命令检查Linux中的大文件是否仅包含零字节()?我可以为此编写一个小程序,但这似乎是一种矫枉过正.

use*_*058 13

如果您正在使用bash,read -n 1如果NUL找到非字符,您可以使用提前退出:

<your_file tr -d '\0' | read -n 1 || echo "All zeroes."
Run Code Online (Sandbox Code Playgroud)

你替换实际文件名的地方your_file.

  • 值得注意的是`file`是这里的文件名,而不是命令`file`. (2认同)
  • 我要补充一点:对于像我这样不了解所有 bash 语法并且不喜欢“神秘”符号(这当然是主观的)的人,这相当于:`cat you_file | tr -d '\0' | 读-n 1 || 回显“全零。”` (2认同)

von*_*and 6

“文件” /dev/zero在读取时返回一个零字节序列,因此a cmp file /dev/zero应该给出您想要的内容(报告第一个不同的字节,恰好超过的长度file)。

  • 好答案。实际上可以告诉 `cmd` 要比较多少字节,所以 `cmp -n $(stat -c %s $FILE) $FILE /dev/zero` 就像一个魅力。 (3认同)

tri*_*eee 5

如果你有Bash,

cmp file <(tr -dc '\000' <file)
Run Code Online (Sandbox Code Playgroud)

如果您没有Bash,以下应该是POSIX(但我想可能有旧版本cmp不适合阅读标准输入):

tr -dc '\000' <file | cmp - file
Run Code Online (Sandbox Code Playgroud)

也许更经济,假设你grep可以读取任意二进制数据,

tr -d '\000' <file | grep -q -m 1 ^ || echo All zeros
Run Code Online (Sandbox Code Playgroud)

我想你可以通过一个dd管道进一步调整最后一个例子来截断tr一个数据块之后的任何输出(如果有很长的序列没有换行符),或者甚至是一个字节.或者也许只是迫使那里有换行.

tr -d '\000' <file | tr -c '\000' '\n' | grep -q -m 1 ^ || echo All zeros
Run Code Online (Sandbox Code Playgroud)


Gui*_*ido 5

它不会赢得优雅奖,但是:

xxd -p file | grep -qEv '^(00)*$'
Run Code Online (Sandbox Code Playgroud)

xxd -p按以下方式打印文件:

23696e636c756465203c6572726e6f2e683e0a23696e636c756465203c73
7464696f2e683e0a23696e636c756465203c7374646c69622e683e0a2369
6e636c756465203c737472696e672e683e0a0a766f696420757361676528
63686172202a70726f676e616d65290a7b0a09667072696e746628737464
6572722c202255736167653a202573203c
Run Code Online (Sandbox Code Playgroud)

所以我们 grep 看看是否有一行不是完全由 0 组成的,这意味着文件中存在与 '\0' 不同的字符。如果不是,则该文件完全由零字符组成。

(返回代码表明发生了哪一件事,我假设您想要将其用于脚本。如果没有,请告诉我,我会写其他内容)

编辑:添加 -E 用于分组, -q 用于丢弃输出。