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

时间:2013-11-26 18:15:17

标签: linux file shell

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

6 个答案:

答案 0 :(得分:12)

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

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

your_file替换实际文件名。

答案 1 :(得分:5)

如果你有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

答案 2 :(得分:5)

&#34;文件&#34; /dev/zero在读取时返回零字节序列,因此cmp file /dev/zero应基本上提供您想要的内容(报告第一个不同的字节超出file的长度)。

答案 3 :(得分:2)

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

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

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

23696e636c756465203c6572726e6f2e683e0a23696e636c756465203c73
7464696f2e683e0a23696e636c756465203c7374646c69622e683e0a2369
6e636c756465203c737472696e672e683e0a0a766f696420757361676528
63686172202a70726f676e616d65290a7b0a09667072696e746628737464
6572722c202255736167653a202573203c

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

(返回代码表示哪一个发生了,我以为你想要一个脚本。如果没有,告诉我,我会写别的东西)

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

答案 4 :(得分:0)

直接的:

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

tr -d删除所有空字节。如果有任何剩余,if [ -n会看到非空字符串。

答案 5 :(得分:-2)

根据回复here

完全更改了我的回答

尝试

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