Die Dateien, die ich zu finden / aufzulisten versuche, sind:
- Beliebige Größe (0 Bytes akzeptiert)
- Besteht nur aus ASCII-NUL-Zeichen (0x00)
- Wenn andere Zeichen als 0x00 vorhanden sind, sollte die Datei nicht aufgelistet werden.
Der Befehl, den ich jetzt habe, ist:
grep -RLP '[^\x00]' .
Was funktioniert, aber es findet auch eine Datei, die nur aus zwei Bytes besteht: 0xFF, 0xFE. Ich weiß nicht warum.
Gibt es einen besseren Befehl, um solche Dateien zu finden?
Antworten:
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):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:Mit denen Sie
find
alle Übereinstimmungen rekursiv suchen können:Ich hoffe das hilft.
quelle
grep
dies zeilenbasiert ist, werden auch Dateien ausgegeben, die vollständig aus Zeilenumbrüchen bestehen. Möglicherweise können Sie dies umgehen, indem Sie den nullterminierten Modus mit angeben-z
(obwohl dadurch alle regulären Textdateien vollständig in den Speicher verwischt werden). Auch ich denke nicht, dass-P
hier erforderlich ist?find
dass das Python-Skript für jede Datei ausgeführt wird. Dies sollte alles in Python-Skript gemacht werden. Schließlich sogar Perl.Sie können
grep
den alternativen nullterminierten Zeilenmodus missbrauchen und somit nach Dateien suchen, die nur leere Zeilen enthalten:Ersetzen Sie ihn
...
durch den Dateisatz, den Sie scannen möchten (hier :)-R .
.Erläuterung
-z
,--null-data
- Behandeln Sie die Eingabe als eine Reihe von Zeilen, die jeweils durch ein Null-Byte (das ASCII-NUL-Zeichen) anstelle einer neuen Zeile abgeschlossen werden. 1-e .
-.
Als Suchmuster verwenden, dh mit einem beliebigen Zeichen übereinstimmen.-L
,--files-without-match
- Normale Ausgabe unterdrücken; Drucken Sie stattdessen den Namen jeder Eingabedatei, aus der normalerweise keine Ausgabe gedruckt worden wäre. Der Scanvorgang wird beim ersten Spiel beendet. 1Testfall
Installieren:
Lauftest:
1 Von der
grep(1)
Handbuchseite .quelle
Ich werde eine andere Antwort geben, nämlich das Skript, das ich verwende. Aus einem bestimmten Ordner ausgeführt, werden alle NUL-Dateien wiederholt und aufgelistet:
quelle