如何'\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
.
“文件” /dev/zero
在读取时返回一个零字节序列,因此a cmp file /dev/zero
应该给出您想要的内容(报告第一个不同的字节,恰好超过的长度file
)。
如果你有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)
它不会赢得优雅奖,但是:
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 用于丢弃输出。