Wie können Sie mit Busybox rekursiv in einer Reihe von Dateien und Verzeichnissen nach einem Ausdruck suchen, dabei aber nur Textdateien durchsuchen?
Wir wissen nicht, wie die Dateierweiterung aussehen wird. Es könnte .sh sein, es könnte nichts sein, es könnte etwas anderes sein. Ich habe überlegt, die Suche irgendwie auf der Kodierung basieren zu lassen, obwohl ich mir auch nicht ganz sicher bin, wie die Kodierung aussehen würde.
Ich habe es versucht busybox grep -r
, aber es durchsucht auch Binärdateien, was viel Zeit verschwendet.
Antwort1
grep
unterstützt die Option, --binary-files
Binärdateien als binary
, text
oder zu behandeln without-match
. Die letzte Option sollte Binärdateien überspringen. Sie ist gleichbedeutend mit grep -I
. Ich habe einen Test gemacht und es scheint, dass Busybox das Überspringen von Binärdateien grep
unterstützt .-I
grep
ist nicht „magisch“, wenn es darum geht zu bestimmen, ob eine Datei binär oder Text ist: Es prüft einfach die ersten paar Bytes, um zu sehen, ob es sich um Text zu handeln scheint oder nicht, und nimmt das Gleiche für den Rest der Datei an (gemäß man grep
).
Randbemerkungen: Man könnte dies emulieren, indem man z. B. vergleicht, ob head -1 myfile
einer Datei gleich ist head -1 myfile | strings
. Wenn file
verfügbar ist, ist es noch abhängiger, aber es ist nicht in Busybox und höchstwahrscheinlich nicht auf dem System, wenn Busybox hauptsächlich verwendet wird.
Antwort2
Was ist der Unterschied zwischen einer Binärdatei mit der Struktur
struct MyBin
{
byte a;
byte b;
byte c;
}
mit den Werten
myBin.a = 70;
myBin.b = 111;
myBin.c = 111;
Und eine Textdatei mit dem Text Foo
?
Eine Textdatei ist nichts anderes als eine Binärdatei, die Sie mithilfe spezieller Suchcodes, sogenannter Zeichenkodierungen (ASCII, UTF-8 usw.), interpretieren. Es gibt also keine einfache Möglichkeit, „Binärdateien“ von „Textdateien“ zu unterscheiden.
Es gibt möglicherweise eine Möglichkeit, Dateien auszuschließen, bei denen das Ausführungsbit gesetzt ist, oder nur nach Dateien unter einer bestimmten Dateigröße zu suchen (ich bezweifle, dass Ihre Textdatei größer als 1 MB ist), aber ich weiß nicht genug darüber, wie man die Grep-Ergebnisse filtert, um ein Beispiel dafür zu geben.