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