2013-11-26 56 views

回答

11

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

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

,你代替實際的文件名your_file

+2

值得注意的是'file'是文件名,而不是命令'file'。 –

+0

I' d add:對於像我這樣的人,他們不知道所有的bash語法,也不喜歡「神祕的」符號(這當然是主觀的),這相當於: 'cat you_file | tr -d'\ 0'|閱讀-n 1 ||回聲「全零」 – brunetton

4

如果你有猛砸,

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

如果你沒有猛砸,下面應該是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

完全改變了我的答案基於回覆here

嘗試

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

在這種情況下,我如何通過命令行將文件內容發送給perl?我檢查了空文件,並沒有產生「是」。 – CodeBlue

+0

對不起,空文件沒問題,但帶有一個非零字節的文件會產生「是」。 – tripleee

+0

像大多數Unix文件處理工具一樣,Perl可以在沒有'cat'的幫助下讀取一個文件('tr'也許是一個明顯的例外)。如果s/^ 0 + $/yes /'文件'打印perl -ne' – tripleee

0

簡單:

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

tr -d刪除所有空字節。如果還有剩餘,則if [ -n會看到一個非空字符串。

+0

如果反引號的輸出溢出了'ARG_MAX',這將會失敗,參見http:// partmaps .org/era/unix/award.html#backticks – tripleee

+0

True。I added | head -c 1. – arnt

0

它不會贏得優雅獎,但:

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

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

23696e636c756465203c6572726e6f2e683e0a23696e636c756465203c73 
7464696f2e683e0a23696e636c756465203c7374646c69622e683e0a2369 
6e636c756465203c737472696e672e683e0a0a766f696420757361676528 
63686172202a70726f676e616d65290a7b0a09667072696e746628737464 
6572722c202255736167653a202573203c 

所以我們grep命令來查看是否有一條線,並不是完全在0以外,這意味着在文件中有一個與'\ 0'不同的字符。如果不是,則文件完全由零字符組成。

(其中一個發生的返回碼信號,我以爲你想它的腳本如果不是,請告訴我,我會寫別的東西。)

編輯:添加-E用於分組和-q到丟棄輸出。

+0

帶括號的分組需要'grep -E'至少對我來說(但顯然很容易修復) – tripleee

+0

For有一些原因是因爲我沒有使用-E,所以我不得不放棄它,不小心丟掉它,編輯添加它,謝謝! – Guido

3

「文件」 /dev/zero返回上讀取零個字節序列,所以cmp file /dev/zero基本上應該給你想要的東西(報告剛剛超越的file長度第一不同的字節)。

相關問題