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

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

Solutions Collecting From Web of "如何检查文件是否只包含在Linux shell中的零?"

如果你正在使用bash,你可以使用read -n 1命令退出,如果发现非NUL字符:

 <your_file tr -d '\0' | read -n 1 || echo "All zeroes." 

在那里你替换your_file的实际文件名。

如果你有Bash,

 cmp file <(tr -dc '\000' <file) 

如果你没有Bash,下面应该是POSIX(但是我想可能有一些旧版本的cmp读标准输入):

 tr -dc '\000' <file | cmp - file 

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

 tr -d '\000' <file | grep -q -m 1 ^ || echo All zeros 

我想你可以调整最后一个例子甚至进一步用一个dd管道tr截断任何一个数据块后(如果有很长的序列没有换行),甚至下降到一个字节的任何输出。 或者,也许只是强迫在那里换行。

 tr -d '\000' <file | tr -c '\000' '\n' | grep -q -m 1 ^ || echo All zeros 

“file” /dev/zero在读取时返回一个零字节序列,所以一个cmp file /dev/zero应该给出你想要的东西(报告第一个不同的字节,超出file的长度)。

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

 xxd -p file | grep -qEv '^(00)*$' 

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

 23696e636c756465203c6572726e6f2e683e0a23696e636c756465203c73 7464696f2e683e0a23696e636c756465203c7374646c69622e683e0a2369 6e636c756465203c737472696e672e683e0a0a766f696420757361676528 63686172202a70726f676e616d65290a7b0a09667072696e746628737464 6572722c202255736167653a202573203c 

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

(返回码信号是哪一个发生的,我假设你想要一个脚本,如果没有,告诉我,我会写点东西)

编辑:添加-E分组和-q放弃输出。

直截了当:

 if [ -n $(tr -d '\0000' < file | head -c 1) ]; then echo a nonzero byte fi 

tr -d删除所有空字节。 如果还有剩下的if [ -nif [ -n看到一个非空字符串。

根据这里的答复完全改变了我的答案

尝试

 perl -0777ne'print /^\x00+$/ ? "yes" : "no"' file