Kurz gesagt, hier wird grep
versucht, Ihre Datei als Unicode-Daten zu interpretieren. Die Sequenz 0xFF, 0xFE ist ein Byte Order Marker für UTF-16 .
(In meinen Tests stimmen selbst andere Sequenzen mit zwei 0xFFs oder zwei 0xFEs usw. immer noch nicht mit dem regulären Ausdruck überein '[^\x00]'
, da diese selbst bei dem Versuch, UTF-8 auszuführen, als Nichtzeichen betrachtet werden.)
Die Verwendung eines Gebietsschemas, in dem Unicode nicht für Zeichentypen verwendet wird, sollte dies beheben. Dies können Sie durch Festlegen der Umgebungsvariablen LC_CTYPE erreichen . Verwenden Sie das C
Gebietsschema, um die ASCII-Codierung zu erzwingen (daher kein Unicode aktiviert):
LC_CTYPE=C grep -RLP '[^\x00]' .
UPDATE : Wie von @steeldriver hervorgehoben, handelt grep immer noch zeilenweise, sodass Dateien mit NUL-Bytes und Zeilenumbrüchen weiterhin übereinstimmen.
Die Lösung von @ DavidFoerster mit grep's -z
löst dieses Problem gut, indem die NUL-Bytes als Trennzeichen verwendet werden.
Alternativ habe ich ein kurzes Python 3-Skript ( allzeroes.py
) entwickelt, um zu überprüfen, ob der Inhalt der Datei alle Nullen sind:
#!/usr/bin/python3
import sys
assert len(sys.argv) == 2
with open(sys.argv[1], 'rb') as f:
for block in iter(lambda: f.read(4096), b''):
if any(block):
sys.exit(1)
Mit denen Sie find
alle Übereinstimmungen rekursiv suchen können:
$ find . -type f -exec allzeroes.py {} \; -print
Ich hoffe das hilft.